我在做一个JavaSelenium-WebDriver
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
和
WebElement textbox = driver.findElement(By.id("textbox"));
因为我的应用程序只需几秒钟就能加载用户界面。所以我设定了2秒的等待时间。但我找不到元素文本框
然后我添加线程。睡眠(2000)
现在它工作得很好。哪一个是更好的方法?
如果使用webdriverJs(node.js),
driver.findElement(webdriver.By.name('btnCalculate')).click().then(function() {
driver.sleep(5000);
});
上面的代码使浏览器在点击按钮后等待5秒钟。
这个线程有点旧,但我想我会发布我目前做的(半成品)。
虽然我仍然遇到系统负载过重的情况,当我单击提交按钮(例如login.jsp)时,这三个条件(见下文)都返回true
,但下一个页面(例如home.jsp)尚未开始加载。
这是一个通用的等待方法,它接受一系列预期条件。
public boolean waitForPageLoad(int waitTimeInSec, ExpectedCondition<Boolean>... conditions) {
boolean isLoaded = false;
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(waitTimeInSec, TimeUnit.SECONDS)
.ignoring(StaleElementReferenceException.class)
.pollingEvery(2, TimeUnit.SECONDS);
for (ExpectedCondition<Boolean> condition : conditions) {
isLoaded = wait.until(condition);
if (isLoaded == false) {
//Stop checking on first condition returning false.
break;
}
}
return isLoaded;
}
我定义了各种可重用的预期条件(下面有三个)。在本例中,三个预期条件包括文档。readyState='complete',不存在“wait_dialog”,也不存在“spinners”(表示正在请求异步数据的元素)。
只有第一种方法可以应用于所有网页。
/**
* Returns 'true' if the value of the 'window.document.readyState' via
* JavaScript is 'complete'
*/
public static final ExpectedCondition<Boolean> EXPECT_DOC_READY_STATE = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
String script = "if (typeof window != 'undefined' && window.document) { return window.document.readyState; } else { return 'notready'; }";
Boolean result;
try {
result = ((JavascriptExecutor) driver).executeScript(script).equals("complete");
} catch (Exception ex) {
result = Boolean.FALSE;
}
return result;
}
};
/**
* Returns 'true' if there is no 'wait_dialog' element present on the page.
*/
public static final ExpectedCondition<Boolean> EXPECT_NOT_WAITING = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
Boolean loaded = true;
try {
WebElement wait = driver.findElement(By.id("F"));
if (wait.isDisplayed()) {
loaded = false;
}
} catch (StaleElementReferenceException serex) {
loaded = false;
} catch (NoSuchElementException nseex) {
loaded = true;
} catch (Exception ex) {
loaded = false;
System.out.println("EXPECTED_NOT_WAITING: UNEXPECTED EXCEPTION: " + ex.getMessage());
}
return loaded;
}
};
/**
* Returns true if there are no elements with the 'spinner' class name.
*/
public static final ExpectedCondition<Boolean> EXPECT_NO_SPINNERS = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
Boolean loaded = true;
try {
List<WebElement> spinners = driver.findElements(By.className("spinner"));
for (WebElement spinner : spinners) {
if (spinner.isDisplayed()) {
loaded = false;
break;
}
}
}catch (Exception ex) {
loaded = false;
}
return loaded;
}
};
根据页面,我可能会使用其中一个或全部:
waitForPageLoad(timeoutInSec,
EXPECT_DOC_READY_STATE,
EXPECT_NOT_WAITING,
EXPECT_NO_SPINNERS
);
在下面的类中还有预定义的ExpectedConditions:org。openqa。硒。支持用户界面。预期条件
有两种类型的等待:显式等待和隐式等待
WebDriverWait.until(condition-that-finds-the-element);
隐式等待的概念是
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
你可以在这里看到细节上的不同。
在这种情况下,我更喜欢使用显式等待(fluentWait
):
java prettyprint-override">public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
});
return foo;
};
fluentWait
函数返回找到的web元素。来自fluentWait
的文档:Wait接口的一种实现,可以动态配置其超时和轮询间隔。每个FluentWait实例定义等待条件的最长时间,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在搜索页面上的元素时忽略NoTouchElementExceptions。你可以在这里获得详细信息
在您的情况下,fluentWait
的用法如下:
WebElement textbox = fluentWait(By.id("textbox"));
这种方法更好,因为您不知道等待的确切时间,并且在轮询间隔内,您可以设置任意时间值来验证哪个元素的存在。当做
问题内容: 我正在研究Java Selenium-WebDriver。我加了 和 因为我的应用程序需要几秒钟来加载用户界面。所以我设置了2秒的隐式等待。但是我找不到元素文本框 然后我添加 现在工作正常。哪一个是更好的方法? 问题答案: 好吧,有两种类型的等待:显式和隐式等待。显式等待的想法是 隐式等待的概念是 你可以在此处获得细节上的差异。 在这种情况下,我宁愿使用显式等待(尤其是): 函数返回找
问题内容: 是的,我知道这个问题经常被问到,但是我还是不明白。我想让Selenium等待,无论如何。我尝试了这些方法 和其他东西,但它不起作用。我需要selenium才能等待10秒。 NO 直到一些元素被加载或什么,只是等待10秒。我知道有这个 我不要那个 。 如果要花几秒钟(无法实现)等待selenium,那么其他(python)库/程序将能够完成此任务?使用Java Selenium似乎没有问
我实际上有三个问题: Selenium WebDriver如何实现此 因为我们不能给无限睡眠的线程一个负值。 有没有更好的方法来实现无限等待? 我们在SeleniumWebDriver文档中看到了这一点
问题内容: 我正在使用C#Selenium-WebDriver。发送密钥后,我要等待几秒钟。我执行以下代码以等待2秒钟。 我这样打电话: 它工作正常。哪一个是更好的方法? 问题答案: 我会不惜一切代价避免使用这样的方法,因为它会减慢测试速度,但是我遇到了我没有其他选择的情况。 总是最好以某种方式观察DOM,例如:
这是一个提倡的范例,即 wait() 应该在同步块内的 while 循环中调用。 我的问题是,waiting()线程如何获得锁? 考虑线程1首先运行并开始等待条件。它释放锁,线程2获得锁设置条件并通知线程1。现在线程1获得锁,检查条件并开始执行“做某事”。 我的问题是当线程1被通知它从time条件开始执行时,已同步(mon)的代码行永远不会再次执行,那么线程1如何获得锁?将锁还给线程1的内部动态是
这是我第一次在项目中使用Java,我需要这样做: 发送CoAP POST请求以打开致动器 但它抛出一个错误无法到达的语句,我不明白为什么:(