java - 通过名称和参数在 selenium 中查找定位器
问题描述
我正在努力弄清楚如何通过其名称查找元素,但不是通过将元素定位器相乘,而是为其类型创建一个并传递参数。例如,有一个页面有 10 个按钮“添加到购物车”,用于不同的项目(“笔记本电脑 A”、“笔记本电脑 B”、“笔记本电脑 c”等),所以我不想创建 3 个不同的元素,我想要一个,比如 > >
webElement elementByName(String itemName) = driver.findElement(By.xpath("//div[@button='add to cart' and @title = '" + itemName+ "']"))
硒中是否存在类似的东西?我是硒的新手,找不到类似的东西。谢谢
解决方案
对的,这是可能的。在分享“答案”之前,我想指出以下几点:
一些注意事项
您需要提供的 xpath 对于 Selenium 来说并没有什么特别之处。它是 W3C 标准。 https://www.w3.org/TR/2017/REC-xpath-datamodel-31-20170321/
如果您使用的是 Chrome,甚至在尝试在 Selenium 中使用它之前,您可以首先通过转到开发人员工具 (F12) 并按“CTRL+F”并在出现的搜索框中输入 xpath 来测试您的 xpath .
如果您的 xpath 匹配某个元素,它将以黄色突出显示。如果该 xpath 有效,那么如果您将相同的 xpath 传递给 Selenium,它也应该有效,除非有其他原因,例如正在使用框架等。例如,Shadow DOM xpath 使用起来不是特别友好。
按可见文本搜索
通过您的示例Laptop A; Laptop B; Laptop C
,如果您想根据可见文本查找元素,那么您可以使用该text()
函数(xpath 提供)。
driver.findElement(By.xpath("//div[text()='Laptop A']");
driver.findElement(By.xpath("//div[text()='Laptop B']");
考虑到上述情况,您可以将字符串放入数组中,并根据需要循环遍历它们A
:B
for(int i=0; i<arr.size; i++){
driver.findElement(By.xpath("//div[text()='Laptop " + arr[i] + "']");
}
此外,您还可以使用contains
类似于正则表达式的函数:
driver.findElement(By.xpath("//div[contains(.,'Laptop')]");
这将匹配任何具有可见文本的内容Laptop
,即Laptop A
, Laptop b
,This is a Laptop
等。
编辑:基于下面的评论
public WebElement selectButtonByName(String name){
return driver.findElement(By.xpath("//div[@button='add to cart' and @title = '" + name+ "']"));
}
然后通过使用它:
WebElement tvElement = selectButtonByName("TV").click();
推荐阅读
- asp.net - 一致的输入模型验证错误报告
- android - 断开和关闭 BLE 连接会停止经典的蓝牙 PBAP 配置文件
- python - 子序列和的最小差
- c++ - 如何在 MSVC 中抑制所有 3rd 方编译时警告
- python - Pycharm 中的机器人框架。变量的自动完成不起作用
- reactjs - 如何在 NextJS 中创建全局枚举
- google-maps - icCube:地理图表限制区域不起作用
- express - multer 文件上传 - 如何在路由中从 multer 获取值?
- excel - 如何正确使用 Excel VBA 中的 Like 函数?
- azure - 有没有更好的方法来导出 Azure DevOps 项目的模板(字段和状态)?