selenium - 从哪里开始 webdriver 使用 xpath 查找元素
问题描述
我目前正在使用 Selenium/Webdriver 测试一个网站,该网站在几个框中显示人员的姓名和地址。例如,每个框都包含一个名字字段。所有这些字段都生成了 ID,所以我不能使用它们。
我的方法是先找到盒子,然后找到我要找的元素。我使用这样的 xPath 表达式,有点复杂,但是对于这个问题,这种方式更容易
WebElement box3 = driver.findElement(By.xpath("//div[contains(@boxnum,'3')]");
WebElement firstName = box3.findElement(By.xpath(".//div[contains(@field,'firstname')]/input");
我也知道有绝对和相对 xPath 表达式,但显然我还没有真正理解它。如果我省略了在 xPath 中搜索 firstName 元素的前导点,则会找到第一个框中的名字字段。但是,我认为我不需要这个,因为我从“box3”开始搜索。不幸的是,我还没有找到以我理解的方式向我解释这一点的文档。我希望这里有人可以解释一下。
解决方案
并不真地。
鉴于以下代码针对https://www.seleniumeasy.com/test/bootstrap-dual-list-box-demo.html页面评估,如下所示:
driver.get("https://www.seleniumeasy.com/test/bootstrap-dual-list-box-demo.html");
WebElement listGroup = driver.findElement(By.xpath("//ul[@class='list-group']"));
List<WebElement> entries = listGroup.findElements(By.xpath("//li[@class='list-group-item']"));
entries.forEach(entry -> System.out.println(entry.getText()));
您将获得下一个输出:
bootstrap-duallist
Dapibus ac facilisis in
Morbi leo risus
Porta ac consectetur ac
Vestibulum at eros
Cras justo odio
Dapibus ac facilisis in
Morbi leo risus
Porta ac consectetur ac
Vestibulum at eros
因为 Selenium 从文档根计算 XPath
如果您将代码修改为:
driver.get("https://www.seleniumeasy.com/test/bootstrap-dual-list-box-demo.html");
WebElement listGroup = driver.findElement(By.xpath("//ul[@class='list-group']"));
List<WebElement> entries = listGroup.findElements(By.xpath(".//li[@class='list-group-item']"));
entries.forEach(entry -> System.out.println(entry.getText()));
您将仅从第一列中获取值。
bootstrap-duallist
Dapibus ac facilisis in
Morbi leo risus
Porta ac consectetur ac
Vestibulum at eros
在第二种情况下,XPath 表达式仅应用于当前节点
查看选择节点章节:
参考:
推荐阅读
- python - 使用beautifulsoup在moneycontrol网站的搜索框中填写库存输入
- c# - 如何在 .NET 中使用类型等价功能?
- azure-active-directory - 不支持关键字:“身份验证”。用于 Azure Sql Sever 连接字符串
- grammar - 如何使用 JJTree 实现给定语法的 AST
- ios - 在 UIScrollView 中调整多行 UILabel 的大小会中断滚动。为什么?
- c++ - 将文件中的数据存入数组c ++
- laravel - 如何在 Mac OS 中为 PHP 7.2 安装 intl 和 mcrpyt?
- c# - C# 错误:无法加载 DLL 'AutoItX3.dll':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)
- javascript - 将对象数组转换为对象值数组
- video.js - 如何删除videojs的seekbar点击事件?