首页 > 解决方案 > 通过名称和参数在 selenium 中查找定位器

问题描述

我正在努力弄清楚如何通过其名称查找元素,但不是通过将元素定位器相乘,而是为其类型创建一个并传递参数。例如,有一个页面有 10 个按钮“添加到购物车”,用于不同的项目(“笔记本电脑 A”、“笔记本电脑 B”、“笔记本电脑 c”等),所以我不想创建 3 个不同的元素,我想要一个,比如 > > webElement elementByName(String itemName) = driver.findElement(By.xpath("//div[@button='add to cart' and @title = '" + itemName+ "']")) 硒中是否存在类似的东西?我是硒的新手,找不到类似的东西。谢谢

标签: javaselenium

解决方案


对的,这是可能的。在分享“答案”之前,我想指出以下几点:

一些注意事项

您需要提供的 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']");

考虑到上述情况,您可以将字符串放入数组中,并根据需要循环遍历它们AB

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();

推荐阅读