NoSuchElementException 同时将 Xpath 与 HtmlUnitDriver 一起使用



我需要在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());
}

查看该元素是否存在于您要查找的页面上。

相关内容

  • 没有找到相关文章

最新更新