【发布时间】:2020-06-30 22:13:48
【问题描述】:
这是一个udemy course(来自“Lets Kode It”),用于使用 selenium 和 Java 开发 Web 自动化框架。 但是,这不是 java 问题。您只需要了解这些语言中的任何一种 - javascript、python、ruby、c# 和 java 的 selenium。
讲师开发了一个 CustomDriver 类,该类具有下面给出的方法/功能。该方法等待元素可点击,而无需在我们的代码中到处写WebDriverWait 语句。它首先将隐式等待设置为零,进行显式等待,然后将隐式等待设置为框架中使用的原始值。
这种方法对我来说似乎没问题,但我不确定。像这样混合隐式和显式等待会导致任何问题吗?
更新(2020 年 3 月 24 日)- 我已经知道混合隐式和显式等待被认为是一种不好的做法,因为它可能导致无法预测的等待时间。我不是在问不可预测的等待时间,因为已经有很多关于这方面的问题和文章。
相反,我要问的是,如果每次执行显式等待之前都将隐式等待设置为零,那可以吗?这还会导致不可预测的等待问题吗?会不会引起其他问题?
/*
Click element when element is clickable
@param locator - locator strategy, id=>example, name=>example, css=>#example,
tag=>example, xpath=>//example, link=>example
@param timeout - Duration to try before timeout
*/
public void clickWhenReady(By locator, int timeout) {
try {
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
WebElement element = null;
System.out.println("Waiting for max:: " + timeout + " seconds for element to be clickable");
WebDriverWait wait = new WebDriverWait(driver, 15);
element = wait.until(
ExpectedConditions.elementToBeClickable(locator));
element.click();
System.out.println("Element clicked on the web page");
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
} catch (Exception e) {
System.out.println("Element not appeared on the web page");
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
}
【问题讨论】:
-
建议不要混合使用,但这似乎是为了确保隐式等待不会与显式等待混淆。隐式的默认值为 0。
-
@pcalkins - 是的,我明白代码中发生了什么。但是,我还需要知道代码是否正常。
-
很难说没有看到其余的代码。我更喜欢总是使用显式等待,但是当您只需要知道元素是否存在时,我可以看到在哪里设置隐式可能更方便。这可能比仅使用显式更有效/优雅是有原因的。
-
@pcalkins - 为什么不看其余代码就很难说?您能否举例说明了解其余代码有何帮助?示例 - 我期待这样的回复 -> 当您的测试并行运行时,此代码将无法正常工作,否则会弄乱您的日志记录。您是否在其余代码中执行任何这些操作?这就是为什么我需要查看您的其余代码的原因。
-
基本上我的意思是,如果大部分代码只依赖于隐式等待,而这种特殊的显式等待很少使用,它可能会更优雅/高效,因为你只需要设置隐式等待一次,无需担心为每个操作/过程定义显式等待。
标签: selenium selenium-webdriver webdriverwait