gpt4 book ai didi

java - WebDriver 不能可靠地单击链接或按钮

转载 作者:行者123 更新时间:2023-11-30 11:52:56 24 4
gpt4 key购买 nike

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

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

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

public void waitAndClick(WebDriver driver, By by) {
WebDriverWait wait = new WebDriverWait(driver, 10000, 2000);
Function<WebDriver, Boolean> waitForElement = new waitForElement(by);
wait.until(waitForElement);

Actions builder = new Actions(driver);
builder.click(driver.findElement(by))
.perform();
}

private class waitForElement implements Function<WebDriver, Boolean> {
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();

它捕获异常但不对其执行任何操作,问题是您重写了 apply 以捕获并记录该异常,因此您看到的是预期的行为,没有其他方法可以检查元素是否已创建不断地要求它。

我自己正在将这段代码用于函数生成器:

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

更简单,您可以将其用于任何定位器

关于java - WebDriver 不能可靠地单击链接或按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com