我需要在Linux机器上运行Selenium并使用HtmlUnitDriver来实现这一点。
Selenium脚本包含大部分Xpath来查找元素。在运行时,NoSuchElementException显示在使用xpath的位置。
org.openqa.selenium.NoSuchElementException: Unable to locate a node using //*[contains(text(),'Sample Text')]
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
相同的代码适用于其他驱动程序,如Chrome,Firefox或IE。
我的代码如下所示,
HtmlUnitDriverdriver = new HtmlUnitDriver();
driver.setJavascriptEnabled(true);
driver.get("http://example.com");
driver.findElement(By.id("username")).sendKeys("xxx");
driver.findElement(By.id("password")).sendKeys("yyy");
driver.findElement(By.id("loginButton")).click();
Thread.sleep(2000);
driver.findElement(By.xpath("//*[contains(text(),'Sample Text')]")).click();
我发现了许多类似的问题,解决方案是提供睡眠时间或等待元素直到加载。我提供了所有内容,但在使用 xpath 时仍然面临此问题。
在我的用例中,按 ID 或名称查找元素是不可能的,因为它每次都会变化。
我只能使用 xpath 来查找 span 标签中的文本。
我需要一个解决方案来处理这个问题。提前感谢!
编辑:
我尝试了相同的gmail登录,仍然遇到同样的问题,
driver.get("http://www.gmail.com");
driver.findElement(By.id("Email")).sendKeys("xxx@gmail.com");
driver.findElement(By.id("next")).click();
Thread.sleep(2000);
driver.findElement(By.id("Passwd")).sendKeys("yyy");
driver.findElement(By.id("signIn")).click();
Thread.sleep(8000);
driver.findElement(By.xpath("//*[contains(text(),'COMPOSE')]")).click();
考虑也摆脱text()
,这可能会导致这种问题。 请改用这个:
contains(., 'Sample Text')
如果您在这里遇到问题,不确定这是原因,鉴于您提供给我们的信息很少,这更像是一个盲目镜头。
首先,我建议提供一个更有效的显式等待,以便它将挂起,直到满足条件,如果您没有提供足够长的超时,也会给你 TimeoutException。
//This will store your locator for later use
By elementLocator = By.xpath("//*[contains(text(),'Sample Text')]");
//This creates a reusable wait object
WebDriverWait wait = new WebDriverWait(browser.driver, 15);
//Waiting is stopped right after the condition is satisfied or timeout (set in the previous line, in secs) was reached
wait.until(ExpectedConditions.elementToBeClickable(elementLocator));
如果您遇到相同的错误,可以尝试此操作
try {
wait.until(ExpectedConditions.elementToBeClickable(elementLocator));
} catch (org.openqa.selenium.TimeoutException e) {
System.out.println(driver.getPageSource());
}
查看该元素是否存在于您要查找的页面上。