WebDriver无法可靠地单击链接或按钮

我一直在拼命想让WebDriver可靠地点击按钮或链接,但它只是不想合作。 我尝试了不同的方法,从设置隐式超时,到下面的代码,假设点击并等待元素出现。

下面的代码片段是在互联网上找到的,它是我最接近可靠的按钮或链接点击。 除了它在调试模式下的工作方式与我在夜间回归测试中执行时的工作方式不同。

有没有人知道在浏览器中点击按钮或链接的另一种方法? 或者我应该使用Selenium 1而不是WebDriver,因为它太新了而无法可靠地使用。

public void waitAndClick(WebDriver driver, By by) { WebDriverWait wait = new WebDriverWait(driver, 10000, 2000); Function waitForElement = new waitForElement(by); wait.until(waitForElement); Actions builder = new Actions(driver); builder.click(driver.findElement(by)) .perform(); } private class waitForElement implements Function { private final By by; private String text = null; public waitForElement(By by) { this.by = by; } public waitForElement(By by, String text) { this.by = by; this.text = text; } @Override public Boolean apply(WebDriver from) { if (this.text != null) { for (WebElement e : from.findElements(this.by)) { if (e.getText().equals(this.text)) { return Boolean.TRUE; } } return Boolean.FALSE; } else { try { driver.switchTo().defaultContent().switchTo().frame("top"); from.findElement(this.by); } catch (Exception e) { logger.error("Unable to find \"" + this.by.toString() + "\". Retrying...."); return Boolean.FALSE; } logger.info("Found \"" + this.by.toString() + "\"."); return Boolean.TRUE; } } } 

在Eclipse Debug模式下调出控制台:

 16:07:08,109 INFO WebDriverUtility: apply Found "By.linkText: Classes". 16:07:10,514 INFO WebDriverUtility: apply Found "By.linkText: Reports". 16:07:17,028 ERROR WebDriverUtility: apply Unable to find "By.linkText: Users". Retrying.... 16:07:26,369 INFO WebDriverUtility: apply Found "By.linkText: Users". 16:07:38,272 ERROR WebDriverUtility: apply Unable to find "By.linkText: System". Retrying.... 16:07:41,334 INFO WebDriverUtility: apply Found "By.linkText: System". 16:07:47,722 ERROR WebDriverUtility: apply Unable to find "By.linkText: Schools". Retrying.... 16:07:50,565 INFO WebDriverUtility: apply Found "By.linkText: Schools". 

从Eclipse运行时控制台输出:

 16:14:04,179 INFO WebDriverUtility: apply Found "By.linkText: Classes". 16:14:04,726 INFO WebDriverUtility: apply Found "By.linkText: Reports". 16:14:09,771 INFO PageAPITesting: login org.openqa.selenium.NoSuchElementException: Unable to find element with link text == Reports (WARNING: The server did not provide any stacktrace information) For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html Build info: version: '2.0rc3', revision: '12536', time: '2011-06-20 18:19:52' System info: os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.6.0_24' Driver info: driver.version: RemoteWebDriver 16:14:09,865 INFO PageAPITesting: login current tabs is Classes 16:14:09,958 INFO WebDriverUtility: apply Found "By.linkText: Schools". 16:14:10,240 INFO PageAPITesting: login java.lang.IllegalStateException: Unable to navigate to the ca.schoolspecialty.qa.api.pages.schools.MenuSchoolPage page 

我没有看到任何奇怪的行为,

wait.until方法,它的作用是在函数上调用apply方法,直到它返回一些东西或者有一个超时。

如果尚未创建元素,有时会收到NotFoundExceptions,实际上如果查看代码,您会看到:

  while (clock.isNowBefore(end)) { try { T value = isTrue.apply(driver); if (value != null && Boolean.class.equals(value.getClass())) { if (Boolean.TRUE.equals(value)) { return value; } } else if (value != null) { return value; } } catch (NotFoundException e) { // Common case in many conditions, so swallow here, but be ready to // rethrow if it the element never appears. lastException = e; } sleep(); 

它捕获exception并且对它没有任何作用,问题是你覆盖了apply to catch并记录了那个exception,所以你看到的是预期的行为,没有其他方法来检查是否已经创建了不断询问的元素为了它。

我自己我将这个代码用于函数生成器:

 public static Function presenceOfElementLocated( final By locator) { return new Function() { @Override public WebElement apply(WebDriver driver) { return driver.findElement(locator); } }; } 

更简单,你可以使用任何定位器