【问题标题】:Xpath is valid and can be found in Elements and Console, but can't be found while running an applicationXpath 有效,可以在 Elements 和 Console 中找到,但在运行应用程序时找不到
【发布时间】:2021-02-12 19:04:41
【问题描述】:

我将 Selenium Webdriver 与 ChromeDriver 一起使用。用 XPath 掌握我的技能。

这是我尝试执行的一段代码:

WebDriver driver;
String baseURL = "http://youtube.com";
System.setProperty("webdriver.chrome.driver", "/Users/svetlana_yatsushko/Documents/workspace/selenium/chromedriver");

driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get(baseURL);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.findElement(By.xpath("//*[@id='dismiss-button']//descendant::yt-formatted-string[1]")).click();

我有一个错误:

线程“主”org.openqa.selenium.NoSuchElementException 中的异常: 没有这样的元素:无法找到元素: {"method":"xpath","selector":"//*[@id='dismiss-button']//descendant::yt-formatted-string[1]"}

我还尝试编写其他 XPaths 选项,例如

  • //*[@aria-label='No, thanks']
  • //*[@id='button']//*[text()='No, thanks']

但是没有一个工作稳定,尽管这些 XPath 已在 Elements 和 Console 中找到并且有 1 个匹配节点。

我注意到一种情况,例如,可以在 5 次中找到 2 次。或者有时连续5次都找不到... 可能这是关于 XPath 问题,但我无法得到原因。

希望你有类似的东西可以帮助我。

【问题讨论】:

  • 尝试在点击元素前添加driver.implicitly_wait(10)
  • 试过了——它有效!而且看起来工作稳定:) 非常感谢!

标签: selenium selenium-webdriver xpath automated-tests


【解决方案1】:

当您设置driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); 时,这意味着Selenium 将等待30 秒以将文档的属性document.readyState 变为complete

但是,通常情况下,UI 是动态构建的,因此在页面加载后它可能会发生变化(可以添加一些元素,可以修改或删除一些元素)。

所以在后一种情况下,应该在 Selenium 中使用一种模式来等待元素 - 服务员(Wait 接口的实现)。他们可以灵活地等待元素对某个条件进行多次轮询。

所以这个

driver.findElement(By.xpath("//*[@id='dismiss-button']//descendant::yt-formatted-string[1]")).click();

可以改成这样:

Wait<WebDriver> wait = new FluentWait<>(driver)
        .pollingEvery(Duration.ofMillis(100))
        .withTimeout(Duration.ofSeconds(30));
        
wait
        .until(
                ExpectedConditions
                        .visibilityOfElementLocated(
                                By.xpath("//*[@id='dismiss-button']//descendant::yt-formatted-string[1]")
                        )
        ).click();

您可以在此处找到有关how FluentWait works 的一些详细信息。

【讨论】:

    猜你喜欢
    • 2017-02-16
    • 2020-07-30
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2016-04-13
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多