我在用:
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
但是对于以下元素它仍然连续失败
driver.findElement(By.id("name")).clear(); driver.findElement(By.id("name")).sendKeys("Create_title_01");
我添加了等待代码:
for (int second = 0;; second++) { if (second >= 120) fail("timeout"); try { if (isElementPresent(By.id("name"))) break; } catch (Exception e) {} Thread.sleep(1000); }
隐式等待是否应该等到找到一个元素后再进行处理?如果我使用Explicit wait而不是我添加的代码,还会更好Thread.sleep()吗?
Explicit wait
Thread.sleep()
TL; DR:始终使用显式等待。忘记隐式等待的存在。
以下是显式等待与隐式等待之间的区别的简要概述:
显式等待:
隐式等待:
WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://somedomain/url_that_delays_loading"); WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
现在显式等待:
WebDriver driver = new FirefoxDriver(); driver.get("http://somedomain/url_that_delays_loading"); WebDriverWait wait = new WebDriverWait(driver, 10); WebElement myDynamicElement = wait.until( ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
两个代码示例都做同样的事情。找到某个元素,如果10秒后找不到,则放弃。隐式等待只能做到这一点。它只能尝试找到具有超时的元素。显式等待的优势在于它可以等待各种条件。还可以自定义超时并忽略某些异常。
的可能的条件例如:elementToBeClickable,numberOfElementsToBeMoreThan或invisibilityOf。这是内置的预期条件的列表:https : //seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
elementToBeClickable
numberOfElementsToBeMoreThan
invisibilityOf
更多说明:
隐式等待超时仅对findElement*方法有效。如果设置,则所有人findElement*将“等待”设置的时间,然后声明找不到元素。
findElement*
findElement*未定义如何等待。它取决于浏览器或操作系统或硒的版本。可能的实现方式是:
该列表是从观察和读取错误报告以及粗略读取硒源代码中收集的。
我的结论是:隐式等待是不好的。功能是有限的。该行为是未记录的,并且取决于实现。
显式等待可以做所有隐式等待可以做的一切。显式等待的唯一缺点是冗长的代码。但是这种冗长的表达使代码变得清晰。显式比隐式更好。对?