首页 > 解决方案 > 等到 elementToBeClickable 不是解决方案,其他元素会收到点击异常

问题描述

昨天我问如何处理:Selenium WebDriver 中的“元素不可点击 - 其他元素会收到点击”异常。

我收到了这个解决方案的几个答案:

WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(...));

是的,它有道理,但在实践中它不起作用。下面是我的一段代码:

                JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeScript("arguments[0].scrollIntoView();", categoryItem);
            Thread.sleep(1000);
            new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(categoryItem));
            categoryItem.click();
            List<WebElement> selects = driver.findElements(By.tagName("select"));
            Select ticketsSelect = new Select(selects.get(3));
            ticketsSelect.selectByValue("2");

            By addToBasket = By.xpath("//div[contains(text(),'Add to Basket')]");
            Thread.sleep(1000);
            new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(addToBasket));
            driver.findElement(addToBasket).click();

我必须在每个等待元素可点击之前放置 1 秒睡眠,因为没有这个它仍然会抛出异常,其他元素会收到点击。我的问题是,如果元素不可点击,为什么 WebDriver 会点击这个元素?

标签: javaselenium-webdriver

解决方案


ElementToBeClickable– 检查元素的期望是可见的并启用,以便您可以单击它。

但似乎并不意味着该元素没有“隐藏”在其他元素下,即使它是另一个标签的透明部分。根据我的经验,当您尝试与当前加载的页面进行交互时,通常会发生此异常,并且典型的加载 div 与加载图标重叠整个页面,或者在其他情况下,当您有一个打开的模式时,这也通常用覆盖透明覆盖覆盖页面,以防止用户与页面交互。

在这个答案中,您可以看到您基本上有两个选择:

  1. 您可以通过 JavaScript 调用发送点击事件。它总是有效的,但这不是你想做的事情。如果你想测试你的页面,你应该总是触发真正的点击事件。
  2. 等待。你无能为力。您只需要等到页面完全加载即可。在某种程度上,这可能会向您展示应用程序的缓慢部分,您可以在未来改进这些部分

推荐阅读