自动化测试能够识别被测应用程序 (AUT) 的 Web 元素至关重要。学习如何查找 Web 元素并在 Selenium 中手动编写动态 XPath 可能需要很长时间和大量练习。
例如,我们将向您展示如何使用 XPath 在 Selenium 中手动轻松地查找 Web 元素。
定位器是 Selenium 的宝贵功能之一。它们使我们能够定位网络元素。例如,如果 id、类名、名称、链接文本等定位器找不到 Web 元素,我们使用 XPath 在网页上查找它们。
XPath,也称为 XML 路径,是 Selenium WebDriver 最常用的定位器之一,用于导航页面的 HTML 结构。它可用于使用 HTML 和 XML 文档中的 HTML DOM 结构来定位网页中的任何元素。
XPath 旨在允许 XML 文档导航来选择 XML 文档的各个元素、属性或其他部分进行特定处理。例如,XPath 生成可靠的定位器,但在性能方面比 CSS 选择器慢。
XPath 语言用于选择 HTML 页面中的元素。使用 XPath,您可以根据标签名称、ID、CSS 类等查找页面上的任何元素。在 Selenium 中,有两种类型的 XPath。
这是查找元素最直接的方法,但“绝对 XPath”的缺点是,如果元素的路径发生变化,该特定的 XPath 就会失败。
XPath 的关键特性是它以单个正斜杠 (/) 开头,表示您可以使用动态 XPath 从根节点选择元素。
相对 XPath 是一种路径从您选择的节点而不是根节点开始的路径。
使用相对 XPath 的好处是你不必指定整个 XPath;相反,您可以从中间或介于两者之间的某个位置开始。
*缺点:*
识别元素将花费更长的时间,因为我们指定了部分路径而不是精确路径。
如果多个元素在同一条路径上,它将选择识别的第一个元素。
从上下文(当前)节点,XPath 轴搜索 XML 文档中的不同节点。例如,它用于查找最接近该树的节点。
XPath 轴是查找动态元素的方法,使用不包含 ID、类名、名称或其他标识符的标准 XPath 方法是不可能找到这些动态元素的。
Axes 方法用于定位由于刷新或其他操作而动态变化的元素。例如,Selenium Webdriver 中常用的有 child、parent、ancestor、sibling、previous、self 等轴方法。
当 AUT 更改是测试自动化中最复杂和最耗时的任务之一时,尤其是在软件开发的早期阶段,他们正在修改测试脚本。
因此,开发人员可能会频繁地将标识符和元素从一个版本更改为另一个版本。此外,AUT 的元素可能在执行过程中动态变化。
为了解决这些问题,自动化测试人员不应为测试用例元素设置固定的 XPath,而应根据特定模式动态编写 XPath 脚本。
以下是在 selenium 中创建动态 XPath 的 11 种独特且不同的方法:
real-device-cloud-cta.jpg
此机制也称为绝对 XPath 元素发现。
语法:
html/body/div[1]/div[2]/div[2]/div[1]/form/div[1]/div/div[1]/div/div/input[1]
单斜杠用于创建具有绝对路径的 XPath,即 XPath 设计用于从文档节点/起始节点/父节点开始选择。
此机制也称为使用相对 XPath 查找元素。
双斜杠用于创建具有相对路径的 XPath,这意味着 XPath 可以从文档中的任何位置开始选择。然后,在整个页面 (DOM) 中查找前面的字符串。
语法
//form/div[1]/div/div[1]/div/div/input[1]
语法可以用两种方式编写,如下所示。 HTML 标记包含或排除。如果要排除 HTML 标签,则必须使用 *.
语法
//[@attribute_name='attribute_value']
或
//*[@attribute_name='attribute_value']
语法
//[@attribute_name1='attribute_value1'][@attribute_name2='attribute_value2]
或
//*[@attribute_name1='attribute_value1'][@attribute_name2='attribute_value2]
语法
//[@attribute_name1='attribute_value1' 和 @attribute_name2='attribute_value2]
或
//*[@attribute_name1='attribute_value1' 和 @attribute_name2='attribute_value2]
语法
//[@attribute_name1='attribute_value1' 或 @attribute_name2='attribute_value2]
或
//*[@attribute_name1='attribute_value1' 或 @attribute_name2='attribute_value2]
Contains() 是一种在熟悉元素属性值的某些部分时识别动态变化的元素的方法。
当熟悉了元素属性的值(以指定文本开头)时,我们可以使用starts-with()方法来识别它。
语法
//[包含(@attribute_name,'attribute_value')]
或
//*[包含(@attribute_name,'attribute_value')]
此机制用于根据网页文本查找元素。
Last() 从所有输入元素中选择最后一个元素(指定类型)。
语法
//[text()='新的登录外观即将推出']
或
//[text()='即将推出新的登录外观']
根据提供的位置编号从所有输入元素中选择元素。
在下面的 XPath 中,[@type='text'] 将定位文本字段,函数 [position()=2] 将识别从顶部数第二个位置的文本字段。
语法
findElement(By.xpath("(//input[@type='text'])[position()=2]"))
或
findElement(By.xpath("(//input[@type='text'])[2]"))
我们可以通过将索引位置放在方括号中来获取第 n 个元素。然后,我们能够使用下面的 XPath 识别姓氏字段。
语法
findElement(By.xpath("//label[2]"))
除了祖先、属性节点和命名空间节点之外,这将选择文档中出现在当前节点之前的所有节点。
WebElement select = driver.findElement(By.id(“性别”));
列表选项 = select.findElements(By.tagName(“男”));
for (WebElement 选项: 选项) {
if(“德国”.equals(option.getText()))
option.click();
使用 selectByValue()
选择列表框 = new Select(驱动程序。
列表框。
选择列表框 = new Select(驱动程序。
WebElement option = listbox.getFirstSelectedOption();
System.out.println(option.getText()); //打印选定的选项。
//列出所有选定的选项。
//列出所有选项。
动态元素是一种 Web 元素,其 ID 不只是 ID,而且任何属性(例如类名、值等)都是不固定的。
因此,每次重新加载页面时,它都会发生变化。因此,您无法仅通过定位器处理该元素。
例如,Gmail 收件箱元素的类名称会随着每次登录而变化。
数据库驱动或会话驱动的动态元素当您更改数据库元素时,它会影响多个正在测试的应用程序区域。
动态元素是严格的内容,其格式在设计中布局。文本框和按钮通常与动态标识符一起使用。
当您自动化动态网站时,一旦内容发生变化,脚本就会中断,导致您的测试失败。然后你每次都需要更新你的测试用例,这是一个耗时的任务。
我们必须始终了解重新加载页面或启动新会话时这些元素的行为方式。一旦我们理解了这些元素,我们就可以制定与它们交互的策略。
与 Selenium 中的部分链接选择器类似,我们可以使用 Xpath 搜索与起始文本匹配元素。
下面列出了上下文节点之后的所有节点。我们可以使用‘the following’来指定网页元素列表中下面列出的元素。
很少有动态元素包含静态值;基于这些价值观;我们可以使用“contains”函数搜索此类元素。例如,上面的 HTML 按钮类名中有一个静态字符串“Hstpl-12345”。例如,我们可以使用 XPath 查找类名包含单词“Hstpl”的按钮元素。
当 DOM 中存在多个具有相似属性的元素时,搜索它们可能会很困难,尤其是当它们是动态的时。
例如,假设页面上有十个按钮,您想找到第五个。然后我们查找带有“button”标签的元素,并转到按钮列表的第五个索引来查找该元素。
绝对 Xpath 使用从根元素到特定元素的整个路径。如下所示,绝对 Xpath 以 HTML 和正斜杠 (/) 开头。要生成 Xpath,请使用 fire path (firebug)。
但是,它们更容易回归,因为 DOM 中的微小变化会导致它们不正确或引用不同的元素。
因此,在大多数情况下,使用绝对 Xpath 并不被认为是最佳实践,但它解决了动态元素问题。
处理动态元素的另一种方法是查找具有相同 Tag 名称的所有元素,然后根据是否包含文本、值或元素属性来搜索所需的元素。
本文演示了如何使用 XPath 函数 contains()、starts-with() 和 text() 以及属性和文本来唯一标识 HTML DOM 结构中的元素。
在 Selenium 中,XPath 用于在其他定位器失败时定位元素。 Selenium XPath 有两种类型:绝对 XPath 和相对 XPath。
来源:本文最初发表于 testgrid.io。
以上是如何在 Selenium 中编写和处理动态 XPath [有策略]的详细内容。更多信息请关注PHP中文网其他相关文章!