我目前正在研究Java硒项目,该项目通常是一个小脚本,在该脚本中,我必须检查每个元素是否存在,并基于是否触发了某些操作,但是我们主要关心的是完成脚本的持续时间
虽然在每种情况下脚本都在运行,但是基本上我已经在脚本中使用了下面的每个脚本并进行了测试,但是我发现脚本执行时间的速度改进很少。我使用的是
words = [word.strip() for word in words if word != '']
answer = " ".join(reversed(words)).strip()
以及它
driver.manage().timeouts().implicitlyWait(10000,TimeUnit.MILLISECONDS);
或
!(driver.findElement(By.xpath("Element Xpath)).isEmpty())
我知道我可以使用CSS选择器,但是由于DOM Tree结构的原因,这是不可行的。 可以用来代替
的东西driver.findElements(By.xpath("Element Xpath)).size()>0
这是为了检查元素是否存在,并基于此我必须触发其他多个动作。
答案 0 :(得分:1)
您的方法存在一些问题。
.implicitlyWait()
实际上并没有等待。它设置了驱动程序实例的超时,因此您只需要设置一次,而不必在每次等待时调用它。
driver.findElement(...).isEmpty()
无法编译。也许您是说.findElements()
?无论哪种方式,.isEmpty()
与.size() > 0
的速度差异都可以忽略不计。
主要问题是检查不存在的东西时启用了隐式等待...尤其是10s等待。这意味着,每次检查元素时,Selenium都会等待10秒钟,即使它期望它不存在。
关闭隐式等待(将其设置为0),然后检查是否存在不希望出现的元素,然后再将其重新打开,将为您提供更好的服务。那将是您希望不存在的10s x存在检查数。根据您执行的存在检查次数,这可能会花费大量时间。缺点之一是,如果您的页面很复杂且具有后台进程,则需要先等待页面(或页面的一部分)完成加载,然后再检查是否存在隐式等待。
旁注...硒贡献者表示,不应使用隐式等待。改用WebDriverWait
,但这是另一回事。
答案 1 :(得分:1)
有几种方法可以最佳速度执行测试套件。您的代码块将使我们对您遇到延迟的原因有更多的了解。但是,对于您的代码段,这里有一些补救措施:
implicitlyWait(10000,TimeUnit.MILLISECONDS);
:越来越多的 Web应用程序被JavaScript,jQuery,AngularJS,ReactJS所采用等等,ExplicitWait即WebDriverWait已成为强制措施,以使快速移动的 WebDriver 实例(即 driver )与滞后的 Browser同步客户。但是再次按照documentation:请勿混合使用隐式和显式等待。这样做可能导致无法预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。
因此第一步是要摆脱所有 implicitlyWait 和replace them by WebDriverWait
driver.findElements(By.xpath("Element Xpath)).size()>0
:findElement()
和findElements()
受执行时有效的“隐式等待”时间的影响。 findElement(..)
调用将返回匹配的行,或重复尝试直到达到配置的超时。 findElement()
不应用于查找不存在的元素,而应使用findElements(By)
和assert
零长度响应。所有这些都增加了很多开销。相反,我建议使用带有明确的Locator Strategy的try-catch {}
块,在出现错误的情况下捕获异常,然后继续。
在考虑上述因素时,您需要: