我需要在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();
答案 0 :(得分:0)
还要考虑摆脱text()
,这可能会导致这类问题。请改用:
contains(., 'Sample Text')
如果你的问题在这里,不确定这是什么原因,考虑到你给我们的一些信息,这更像是一个盲目的镜头。
答案 1 :(得分:0)
我首先建议提供一个更有效的显式等待,以便在条件满足之前暂停,如果你没有提供足够长的超时,也会给你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());
}
要查看您正在寻找的页面上是否存在该元素。