使用selenium和java的yahoo finance页面中的自动建议的预期条件不起作用

t1rydlwq  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(423)

如果在等待条件中标识了WebElement,则下面的代码无法标识这些WebElement的列表。我得到了一个异常timeoutexception,无法识别指定xpath的元素。
但是,如果我不带等待条件直接访问元素,那么值就被分配给list变量,这是为什么呢?

WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("https://www.finance.yahoo.com");
driver.manage().window().maximize();
driver.findElement(By.xpath("//input[@id='yfin-usr-qry']")).sendKeys("nclh");

WebDriverWait wait = new WebDriverWait(driver,5);
List<WebElement>dd_list= wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@class='modules_list__1zFHY']/li")));
System.out.println(dd_list.size());

for(WebElement ele : dd_list) {

    if (ele.getText().contains("NCLH.VI")) {
        System.out.println("i got the element");
    }
}
e5njpo68

e5njpo681#

为什么会这样?
目标元素永远不会同时显示。xpath返回15个元素,其中只有10个可见。意味着你的条件永远不会满足(因此超时例外)。只需优化xpath,以便针对您感兴趣的元素:那些具有可见使命的元素,例如。 "//ul[@class='modules_list__1zFHY']/li[@data-type='quotes']"

5cg8jx4n

5cg8jx4n2#

yahoo finance网站包含启用JS的元素。所以你需要诱导webdriverwait document.readyState 成为 complete 您可以使用以下定位器策略:
代码块:

driver.get("https://www.finance.yahoo.com");
new WebDriverWait(driver, 120).until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@id='yfin-usr-qry']")));
element.click();
element.sendKeys("nclh");
System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@class='modules_list__1zFHY']//li[@data-type='quotes']"))).size())

控制台输出:

6

浏览器快照:

相关问题