首页 >web前端 >js教程 >如何在 Selenium 中编写和处理动态 XPath [有策略]

如何在 Selenium 中编写和处理动态 XPath [有策略]

DDD
DDD原创
2024-11-18 06:35:03307浏览

How to Write and Handle Dynamic XPath In Selenium [with Tactics]

自动化测试能够识别被测应用程序 (AUT) 的 Web 元素至关重要。学习如何查找 Web 元素并在 Selenium 中手动编写动态 XPath 可能需要很长时间和大量练习。

例如,我们将向您展示如何使用 XPath 在 Selenium 中手动轻松地查找 Web 元素。

定位器是 Selenium 的宝贵功能之一。它们使我们能够定位网络元素。例如,如果 id、类名、名称、链接文本等定位器找不到 Web 元素,我们使用 XPath 在网页上查找它们。

Selenium 中的动态 XPath 是什么?

XPath,也称为 XML 路径,是 Selenium WebDriver 最常用的定位器之一,用于导航页面的 HTML 结构。它可用于使用 HTML 和 XML 文档中的 HTML DOM 结构来定位网页中的任何元素。

XPath 旨在允许 XML 文档导航来选择 XML 文档的各个元素、属性或其他部分进行特定处理。例如,XPath 生成可靠的定位器,但在性能方面比 CSS 选择器慢。

XPath 语言用于选择 HTML 页面中的元素。使用 XPath,您可以根据标签名称、ID、CSS 类等查找页面上的任何元素。在 Selenium 中,有两种类型的 XPath。

在 Selenium 中使用动态 XPath 查找元素的不同方法:

01 绝对 XPath

这是查找元素最直接的方法,但“绝对 XPath”的缺点是,如果元素的路径发生变化,该特定的 XPath 就会失败。

XPath 的关键特性是它以单个正斜杠 (/) 开头,表示您可以使用动态 XPath 从根节点选择元素。

02 相对 XPath

相对 XPath 是一种路径从您选择的节点而不是根节点开始的路径。

使用相对 XPath 的好处是你不必指定整个 XPath;相反,您可以从中间或介于两者之间的某个位置开始。

*缺点:*

识别元素将花费更长的时间,因为我们指定了部分路径而不是精确路径。

如果多个元素在同一条路径上,它将选择识别的第一个元素。

如何在selenium中查找动态元素的XPath?

从上下文(当前)节点,XPath 轴搜索 XML 文档中的不同节点。例如,它用于查找最接近该树的节点。

XPath 轴是查找动态元素的方法,使用不包含 ID、类名、名称或其他标识符的标准 XPath 方法是不可能找到这些动态元素的。

Axes 方法用于定位由于刷新或其他操作而动态变化的元素。例如,Selenium Webdriver 中常用的有 child、parent、ancestor、sibling、previous、self 等轴方法。

当 AUT 更改是测试自动化中最复杂和最耗时的任务之一时,尤其是在软件开发的早期阶段,他们正在修改测试脚本。

因此,开发人员可能会频繁地将标识符和元素从一个版本更改为另一个版本。此外,AUT 的元素可能在执行过程中动态变化。

为了解决这些问题,自动化测试人员不应为测试用例元素设置固定的 XPath,而应根据特定模式动态编写 XPath 脚本。

在 Selenium 中创建动态 XPath 的 11 种独特方法:

以下是在 selenium 中创建动态 XPath 的 11 种独特且不同的方法:

real-device-cloud-cta.jpg

01 使用单斜线

此机制也称为绝对 XPath 元素发现。

语法:

html/body/div[1]/div[2]/div[2]/div[1]/form/div[1]/div/div[1]/div/div/input[1]
单斜杠用于创建具有绝对路径的 XPath,即 XPath 设计用于从文档节点/起始节点/父节点开始选择。

02 使用双斜线

此机制也称为使用相对 XPath 查找元素。

双斜杠用于创建具有相对路径的 XPath,这意味着 XPath 可以从文档中的任何位置开始选择。然后,在整个页面 (DOM) 中查找前面的字符串。

语法

//form/div[1]/div/div[1]/div/div/input[1]

03 使用单一属性

语法可以用两种方式编写,如下所示。 HTML 标记包含或排除。如果要排除 HTML 标签,则必须使用 *.

语法

//[@attribute_name='attribute_value']

//*[@attribute_name='attribute_value']

04 使用多个属性

语法

//[@attribute_name1='attribute_value1'][@attribute_name2='attribute_value2]

//*[@attribute_name1='attribute_value1'][@attribute_name2='attribute_value2]

05 使用 AND

语法

//[@attribute_name1='attribute_value1' 和 @attribute_name2='attribute_value2]

//*[@attribute_name1='attribute_value1' 和 @attribute_name2='attribute_value2]

06 使用 OR

语法

//[@attribute_name1='attribute_value1' 或 @attribute_name2='attribute_value2]

//*[@attribute_name1='attribute_value1' 或 @attribute_name2='attribute_value2]

07 使用 contains()

Contains() 是一种在熟悉元素属性值的某些部分时识别动态变化的元素的方法。

当熟悉了元素属性的值(以指定文本开头)时,我们可以使用starts-with()方法来识别它。

语法

//[包含(@attribute_name,'attribute_value')]

//*[包含(@attribute_name,'attribute_value')]

#08 文本 () 的使用

此机制用于根据网页文本查找元素。

Last() 从所有输入元素中选择最后一个元素(指定类型)。

语法

//[text()='新的登录外观即将推出']

//
[text()='即将推出新的登录外观']

09 使用position(),

根据提供的位置编号从所有输入元素中选择元素。

在下面的 XPath 中,[@type='text'] 将定位文本字段,函数 [position()=2] 将识别从顶部数第二个位置的文本字段。

语法

findElement(By.xpath("(//input[@type='text'])[position()=2]"))

findElement(By.xpath("(//input[@type='text'])[2]"))

10 使用索引

我们可以通过将索引位置放在方括号中来获取第 n 个元素。然后,我们能够使用下面的 XPath 识别姓氏字段。

语法

findElement(By.xpath("//label[2]"))

11 使用以前的 XPath 轴

除了祖先、属性节点和命名空间节点之外,这将选择文档中出现在当前节点之前的所有节点。

如何从 Selenium 中的列表中选择 Web 元素?

WebElement select = driver.findElement(By.id(“性别”));
列表选项 = select.findElements(By.tagName(“男”));
for (WebElement 选项: 选项) {
if(“德国”.equals(option.getText()))
option.click();

Selenium 如何处理列表框?

使用 selectByValue()

选择列表框 = new Select(驱动程序。
列表框。
选择列表框 = new Select(驱动程序。
WebElement option = listbox.getFirstSelectedOption();
System.out.println(option.getText()); //打印选定的选项。
//列出所有选定的选项。
//列出所有选项。

如何在 Selenium 中编写动态 Web 元素?

动态元素是一种 Web 元素,其 ID 不只是 ID,而且任何属性(例如类名、值等)都是不固定的。

因此,每次重新加载页面时,它都会发生变化。因此,您无法仅通过定位器处理该元素。

例如,Gmail 收件箱元素的类名称会随着每次登录而变化。

数据库驱动或会话驱动的动态元素当您更改数据库元素时,它会影响多个正在测试的应用程序区域。

动态元素是严格的内容,其格式在设计中布局。文本框和按钮通常与动态标识符一起使用。

当您自动化动态网站时,一旦内容发生变化,脚本就会中断,导致您的测试失败。然后你每次都需要更新你的测试用例,这是一个耗时的任务。

我们必须始终了解重新加载页面或启动新会话时这些元素的行为方式。一旦我们理解了这些元素,我们就可以制定与它们交互的策略。

#01 带有起始文本的相对 Xpath

与 Selenium 中的部分链接选择器类似,我们可以使用 Xpath 搜索与起始文本匹配元素。

#02 后面或前面有节点的相对 Xpath

下面列出了上下文节点之后的所有节点。我们可以使用‘the following’来指定网页元素列表中下面列出的元素。

#03 文本包含相对 Xpath

很少有动态元素包含静态值;基于这些价值观;我们可以使用“contains”函数搜索此类元素。例如,上面的 HTML 按钮类名中有一个静态字符串“Hstpl-12345”。例如,我们可以使用 XPath 查找类名包含单词“Hstpl”的按钮元素。

#04 索引元素

当 DOM 中存在多个具有相似属性的元素时,搜索它们可能会很困难,尤其是当它们是动态的时。

例如,假设页面上有十个按钮,您想找到第五个。然后我们查找带有“button”标签的元素,并转到按钮列表的第五个索引来查找该元素。

#05 绝对Xpath方法

绝对 Xpath 使用从根元素到特定元素的整个路径。如下所示,绝对 Xpath 以 HTML 和正斜杠 (/) 开头。要生成 Xpath,请使用 fire path (firebug)。

但是,它们更容易回归,因为 DOM 中的微小变化会导致它们不正确或引用不同的元素。

因此,在大多数情况下,使用绝对 Xpath 并不被认为是最佳实践,但它解决了动态元素问题。

#06 IWebElement 接口正在使用。

处理动态元素的另一种方法是查找具有相同 Tag 名称的所有元素,然后根据是否包含文本、值或元素属性来搜索所需的元素。

结论

本文演示了如何使用 XPath 函数 contains()、starts-with() 和 text() 以及属性和文本来唯一标识 HTML DOM 结构中的元素。

在 Selenium 中,XPath 用于在其他定位器失败时定位元素。 Selenium XPath 有两种类型:绝对 XPath 和相对 XPath。

来源:本文最初发表于 testgrid.io。

以上是如何在 Selenium 中编写和处理动态 XPath [有策略]的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn