等到elementToBeClickable不是其他元素的解决方案就会收到点击异常

时间:2018-05-17 09:51:57

标签: java selenium-webdriver

昨天我问问题如何处理:"元素在点上不可点击 - 其他元素会收到点击" 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会点击此元素吗?

1 个答案:

答案 0 :(得分:2)

ElementToBeClickable - 可以看到并启用检查元素的期望,以便您可以单击它。

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

在这个answer中你可以看到你基本上有两个选择:

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