java - Selenium try/catch click 似乎需要很长时间?
问题描述
在编写 Selenium 测试时,我总是遇到一个问题,尝试单击未准备好的元素会导致 StaleElementReference/ElementClickIntercepted 异常。如果我只等待 2 秒以使项目可点击,这可以通过使测试在成功时失败而使测试变得不稳定。
我已经修复了WebElement
检索,在我认为它丢失之前,我使用隐式等待等待一个元素的出现大约 2 秒,并且我一直在尝试创建一个clickElement()
围绕基本click()
函数的函数来实现相同的目的。
它的目的是不断尝试以 100 毫秒的增量单击,直到可以为止。我通过捕获异常并为每次单击增加一个计数器来做到这一点,并且仅在单击元素或单击太多尝试引发异常时才跳出循环。
这是我写的函数:
public void clickElement(WebElement element) {
int maxTimeOut = 50;
int timeOutCt = 0;
boolean isTimedOut = false;
System.out.println("=> Try to click on <" + element.getTagName() + ">");
while ( !isTimedOut ) {
try {
element.click();
isTimedOut = true; // could click
System.out.println("\n OK \n");
} catch (Exception e) {
waitSeconds(0.1);
timeOutCt++;
System.out.println(" \t => Error while attempting to click for the " + timeOutCt +"nd time \n");
if ( timeOutCt > maxTimeOut ) {
isTimedOut = true;
fail("Element <" + element.getTagName() + "> is not clickable. See exception: " + e);
}
}
}
}
等待秒是:
public void waitSeconds(double t) {
long mT = (long) (t * 1000);
try {
System.out.print("\n \t \t ( ) Sleep de " + mT + "secondes");
Thread.sleep(mT);
System.out.print(" ... Done \n ");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
我遇到的问题是,这样做似乎需要很长的时间,至少超过一毫秒,至少我可以说它持续超过一秒。我想也许我的waitSeconds()
功能不能正常工作,但我在一个简单的程序中对其进行了测试,它应该可以正常工作:waitSeconds(0.1)
导致 100 毫秒的等待。
那么为什么当clickElement
被调用并尝试多次单击一个元素时,两次尝试之间可能需要长达两秒钟的时间?
是控制台输出减慢了速度吗?
或者是 try/catch 搞砸了一切?
解决方案
对于 try/catch,我遇到了一些类似的问题,尝试在 try/catch 块之前禁用隐式等待并在 catch 之后再次启用它。希望这会有所帮助。
推荐阅读
- c++ - 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- heroku - 在 Heroku 上使用 Daphne 的 Websocket 握手期间出错,错误代码为 500
- mysql - Kubernetes MySQL pod 卡在 CrashLoopBackOff
- python - 如何从 orm 中获取数据库值并从 odoo 8 中的字符串中获取字段名称
- python - 多元 LSTM 股票预测
- thingsboard - 规则链中的设备删除事件处理能够减少客户级别的设备总数
- mysql - 在mysql中选择假设未来日期的记录
- php - 查看 [layouts.account] 未找到。什么问题?[AsgardCms]
- if-statement - 带有嵌套If语句的Google表格多个条件?
- python-3.x - 从一个点到一组有限点的距离