【发布时间】:2018-12-13 02:58:53
【问题描述】:
我一直在用
WebElement strecord = driver.findElement(By.name("Ui_u123));
值只能使用“By.name”定位
字段现在是动态的,但前 3 个字符始终是“Ui_u”
我现在怎么才能找到它,“By.name”包含......?
【问题讨论】:
标签: java selenium xpath css-selectors webdriver
我一直在用
WebElement strecord = driver.findElement(By.name("Ui_u123));
值只能使用“By.name”定位
字段现在是动态的,但前 3 个字符始终是“Ui_u”
我现在怎么才能找到它,“By.name”包含......?
【问题讨论】:
标签: java selenium xpath css-selectors webdriver
你可以试试这个xpath:
//*[starts-with(@name,'Ui_u')]
虽然这是 xpath。我不确定带有 Name 属性的 starts-with。
它可能匹配多个元素。在这种情况下,您将不得不使用findElements()
代码:
List<WebElement> strecord = driver.findElements(By.xpath("//*[starts-with(@name,'Ui_u')]"));
作为@HellPine 答案的补充。您可以将 css 选择器编写为:
tagName[name^='Ui_u']
【讨论】:
你为什么不试试 CSS 方式 [name*='Ui_u'] ?
注意*= 表示包含,您可以将[] 用于元素上的任何标记。
问候,
【讨论】:
直接回答,不,你不能将contains与By.name结合使用。
根据Locator Strategies,当您使用driver.findElement(By.name("Ui_u123)); 时,内部Java 客户端 实现:
case "name":
toReturn.put("using", "css selector");
toReturn.put("value", "*[name='" + value + "']");
break;
转换定位器策略:
driver.findElement(By.name("Ui_u123));
到:
driver.findElement(By.cssSelector("[name='Ui_u123']));
您可以在Official locator strategies for the webdriver找到详细讨论
现在,如果你强行尝试使用关键字contains,它将引发InvalidSelectorException,如下所示:
org.openqa.selenium.InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression
如果您想实现类似于contains 的方法,您可以使用以下任一解决方案:
^:表示一个属性值以
WebElement strecord = driver.findElement(By.cssSelector("[name^='Ui_u']));
$:表示属性值以结尾(不适用于您的情况,因为属性以Ui_u开头)
WebElement strecord = driver.findElement(By.cssSelector("[name$='123']));
*:表示一个属性值包含
WebElement strecord = driver.findElement(By.cssSelector("[name*='Ui_u']));
您可以在How to get selectors with dynamic part inside using Selenium with Python?找到详细讨论
【讨论】: