java - 等到 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 会点击这个元素?
解决方案
ElementToBeClickable
– 检查元素的期望是可见的并启用,以便您可以单击它。
但似乎并不意味着该元素没有“隐藏”在其他元素下,即使它是另一个标签的透明部分。根据我的经验,当您尝试与当前加载的页面进行交互时,通常会发生此异常,并且典型的加载 div 与加载图标重叠整个页面,或者在其他情况下,当您有一个打开的模式时,这也通常用覆盖透明覆盖覆盖页面,以防止用户与页面交互。
在这个答案中,您可以看到您基本上有两个选择:
- 您可以通过 JavaScript 调用发送点击事件。它总是有效的,但这不是你想做的事情。如果你想测试你的页面,你应该总是触发真正的点击事件。
- 等待。你无能为力。您只需要等到页面完全加载即可。在某种程度上,这可能会向您展示应用程序的缓慢部分,您可以在未来改进这些部分
推荐阅读
- android - 如何在 MutableStateFlow 中初始化密封类
- javascript - Js for循环更改字符串-它怎么知道?
- reactjs - 在响应之前响应 websocket 消息
- reactjs - 如何在 react-leaflet 中添加自己的 Tilelayer?
- python - python中奇怪的多线程行为
- excel - 有什么方法可以更快地为 Excel VBA Sumifs 工作?
- android - 使用 searchview 在 recyclerview 中突出显示过滤器文本
- javascript - 如何使用 javascript 添加新的数据行?
- excel - 检查字符串是否在 Variant 中,然后分别将 Yes/No 结果替换为 1/0
- flutter - BuildContext 不是在 showDialog 小部件中使用 ListView.builder 的 Flutter 类型