当前位置: 首页 > 知识库问答 >
问题:

与隐式等待()的同步不起作用,为什么?

杜俊爽
2023-03-14

我正在尝试与selenium webDrive同步,但某些东西无法隐含地使用等待()。

我隐含理解的方式等待(...)是代码正在等待,直到元素在最大时间内可用。

以下代码因错误而崩溃:

org.openqa.selenium.InvalidElementStateException: invalid element state: Element is not currently interactable and may not be manipulated

系统。out ist打印:--

private static WebDriver driver;    
public static void main(String[] args) throws InterruptedException {
         setupWebDriverChrome();
        //Thread.sleep(1000);
        final String cssSelectorFromAirport = "div.od-airportselector.airportselector_root input[tabindex='11']";
        final By cssSelector = By.cssSelector(cssSelectorFromAirport);
        WebElement fromAirportElement = driver.findElement(cssSelector);
        System.out.println("-->> " + fromAirportElement.isDisplayed() + " " + fromAirportElement.isEnabled() + " " + fromAirportElement.isSelected());       
        fromAirportElement.clear();
        fromAirportElement.sendKeys("MUC");
    }

    private static void setupWebDriverChrome() {
        System.setProperty("webdriver.chrome.driver", "C:\\...\\chromedriver.exe");
        setupLocation();
    }
    private static void setupLocation() {
        driver.manage().timeouts().implicitlyWait(1000, TimeUnit.MILLISECONDS);     
        driver.get("https://www.opodo.de/");
    }

我也用Geckodriver试过了,结果也一样。

我也增加了等待时间,但结果相同。

使其工作的唯一方法是使用Thread.sleep()(上面评论)

编辑请注意,我没有看到任何重复与硒隐含等待不工作。

共有1个答案

寿飞飙
2023-03-14

您必须等待您的元素是可点击的。尝试添加以下内容:

 WebElement element = (new WebDriverWait(driver, 10))
                .until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssSelectorFromAirport)));

因此:

    setupWebDriverChrome();
    //Thread.sleep(1000);
    final String cssSelectorFromAirport = "div.od-airportselector.airportselector_root input[tabindex='11']";
    WebElement element = (new WebDriverWait(driver, 10))
            .until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssSelectorFromAirport)));
    /*final By cssSelector = By.cssSelector(cssSelectorFromAirport);
    WebElement fromAirportElement = driver.findElement(cssSelector);
    System.out.println("-->> " + fromAirportElement.isDisplayed() + " " + fromAirportElement.isEnabled() + " " + fromAirportElement.isSelected());*/
    element.clear();
    element.sendKeys("MUC");

编辑

从文档中:

隐式等待是告诉WebDriver在尝试查找一个或多个元素时轮询DOM一定时间,如果它们不能立即可用。默认设置为0。设置后,隐式等待将为WebDriver对象实例的生命周期设置。

这意味着,在您的示例中,selenium找到了元素,但它尚未“可点击”。

您也可以在测试中看到这一点。如果您查看:

System.out.println("-->> " + fromAirportElement.isDisplayed() + " " + fromAirportElement.isEnabled() + " " + fromAirportElement.isSelected() );

当出现故障时,输出为:

-->> false true false

当它工作时:

-->> true true false
 类似资料:
  • 问题内容: 我正在学习Java Maven Selenium。我想要在Selenium中使用这样的东西。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,

  • 问题内容: 这是我第一次使用selenium和无头浏览器,因为我想使用ajax技术来爬网某些网页。 效果很好,但是在某些情况下,加载整个页面会花费太多时间(尤其是当某些资源不可用时),因此我必须为selenium设置超时时间。 首先,我尝试了和,但是当我设置这些超时时,如果页面未完全加载,我将不会得到任何页面源,如下代码所示: 所以我尝试使用隐式等待和条件等待,如下所示: 这次我得到了想要的内容。

  • 问题内容: 我正在学习Java Maven Selenium。我希望在Selenium中使用。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,他们将在指

  • 问题内容: 我是Selenium WebDriver的新手,正在尝试了解“等待”元素出现的正确方法。 我正在测试一个带有单选按钮答案的问题的页面。选择答案时,JavaScript可能启用/禁用页面上的某些问题。 问题似乎是Selenium的“单击速度太快”,而不是等待Javascript完成。我尝试用两种方式解决此问题- 显式等待解决了该问题。具体来说,这可以解决我的问题: 但是,我 宁愿 使用隐

  • 问题内容: 当隐式等待少于显式等待时,就会发生误解: 总时间:8.613秒。隐式设置等待第二个较低:3000,结果为6.865秒。它是如何工作的?预先感谢! 问题答案: 那是个好问题。许多优秀的QA自动化专家为此大吃一惊。 隐式等待 每个上都有特殊的隐藏自动等待。如果在页面DOM结构中找不到元素,则原始Web驱动程序(js,python,java)会引发NoSuchElementException

  • 我得到以下警告... 警告1此异步方法缺少await运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。