繁体   English   中英

等待 - 在使用 Selenium 和 Java 的 Yahoo Finance 页面中,预期条件不适用于自动建议

[英]Wait- Expected conditions not working for auto-suggestion within Yahoo Finance page using Selenium and Java

如果 webelement 在等待条件内被识别,则下面的代码无法识别它们的列表。 我收到一个超时异常,无法识别指定 xpath 的元素。

但是,如果我在没有等待条件的情况下直接访问元素,则将值分配给列表变量,为什么会这样?

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");
    }
}

为什么会这样?

您定位的元素永远不会同时全部可见。 您的 xpath 返回 15 个元素,其中只有 10 个可见。 暗示您的条件永远不会满足(因此超时异常)。 只需优化您的 xpath 以定位您感兴趣的元素:那些具有可见性的元素,例如"//ul[@class='modules_list__1zFHY']/li[@data-type='quotes']"

在此处输入图片说明

雅虎财经网站包含支持ReactJS 的元素。 因此,您需要引入WebDriverWait以使document.readyState complete ,您可以使用以下Locator Strategies

  • 代码块:

     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
  • 浏览器快照:

雅虎财经

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM