如何修复Selenium Webdriver异常ElementNotVisibleException?

时间:2017-03-07 10:42:14

标签: java selenium

我正在尝试使用Selenium解析Upwork并获得异常

  

线程中的异常" main"   org.openqa.selenium.ElementNotVisibleException:

我不明白为什么。我尝试在链接本身上单击包含链接的h2元素,但仍获得相同的异常。我在开发工具中检查这个元素的样式,这个元素是可见的。

我尝试使用ExpectedConditions并等待元素变得可见,但是获得超时异常。我做错了什么以及如何点击此链接?

当然我可以使用uri并打开它,但我想点击解决问题。

System.setProperty("webdriver.gecko.driver", "/usr/local/bin/geckodriver");
WebDriver driver = new FirefoxDriver();
driver.get("https://www.upwork.com/o/jobs/browse/");
List<WebElement> titles = driver.findElements(By.className("job-title"));
for (WebElement title: titles) {
    System.out.println("text: " + title.getAttribute("innerText"));
    System.out.println("tag: " + title.getTagName());
    title.click();
    driver.navigate().back();
}

1 个答案:

答案 0 :(得分:1)

我不确定您到底想要做什么,但是如果您想要抓住网站,请告诉您这种方法可能无效。这些网站配备了识别机器人的功能,稍后或者很快就会识别您的代码,您将获得验证码以进行验证。

但是让我们谈谈你的代码,它失败了因为元素不可见。这很简单,可能是因为可见性标志为false或大小不可用或其他原因。简单的修复是获取 href 元素,您的问题就解决了。

只需添加TODO代码即可运行此代码。

    WebDriver driver = new FirefoxDriver();
    driver.get("https://www.upwork.com/o/jobs/browse/");
    List<WebElement> titles = driver.findElements(By.xpath("//h2/a"));
    for (int i=0; i<titles.size(); i++) {
        //TODO add a code to wait until first page loaded

        //To handle StaleElementReferenceException
        WebElement title = driver.findElements(By.xpath("//h2/a")).get(i);
        System.out.println("text: " + title.getAttribute("innerText"));
        System.out.println("tag: " + title.getTagName());
        title.click();
        driver.navigate().back();
    }