java - 为什么 Selenium 在点 (.) 字符后面附加一个反斜杠,对于其中包含 (.) 的 ID 属性的值产生 (\.)

标签 java selenium selenium-webdriver css-selectors webdriver

我想在JAVA中使用selenium通过ID获取元素。当我尝试像这样查找元素时,相关元素的 ID 恰好有一个句点 id="myprojectId0.123456789"

WebElement projId = driver.findElement(By.id("mprojectId0.10724909303153396"));

我在控制台中收到此错误:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: #mprojectId0\.10724909303153396

由于某种原因,ID 属性值中的 . 字符被转换为 \.,因此无法找到该元素。请帮忙并提前致谢!

最佳答案

您的观察非常合理且符合预期。根据Official locator strategies for the webdriver中的讨论By.idSelenium 翻译到它等效的 By.cssSelector 中,并且由于 . 字符是特殊字符,因此它会自动 通过反斜杠转义,即\。因此:

By.id("mprojectId0.10724909303153396")

被翻译成

By.cssSelector("#mprojectId0\.10724909303153396")
<小时/>

解决方案

然而,id属性的值,即mprojectId0.10724909303153396对我来说看起来是动态的,并且每次都会改变HTML DOM被渲染。因此,您必须为 visibilityOfElementLocated() 引入 WebDriverWait,并且您可以使用以下任一动态定位器策略:

  • css选择器:

    WebElement projId = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("[id^='mprojectId']")));
    
  • xpath:

    WebElement projId = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[starts-with(@id, 'mprojectId')]")));
    

关于java - 为什么 Selenium 在点 (.) 字符后面附加一个反斜杠,对于其中包含 (.) 的 ID 属性的值产生 (\.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57929595/

相关文章:

javascript - Protractor :一个测试通过,但另一个失败

java - 启动 ChromeDriver 时出现异常

java - URLRewrite 过滤器不适用于多部分表单

java - 用Java创建一个文字游戏(字典文件组织问题)

java - 没有 FK 的 JPA 关联中的 NULL 处理

selenium - 在 selenium web 驱动程序中制作测试项目的 jar 文件

java - 如何处理 Selenium 中的 Authentication header ?

javascript - 如何编写脚本来接受 SSL 证书

javascript - Webdriver:如何使用js删除元素

java - 无法创建内部bean 'org.springframework.web.servlet.view.xml.MarshallingView#1e9ad27'