我目前正在学习Selenium,我学到了很多东西。社区说的一件事;是你需要尽可能避免thread.sleep。 Selenium在替换中使用隐式和显式等待。是的,我理解这个概念。
最近我遇到了一个问题。这是没有一定动作的;从登录页面转到另一个页面,而不使用Thread.sleep(1000)。 Selenium似乎太崩溃了:它无法找到某个元素。我觉得这个行为很奇怪。所以我认为发生这种冲突,因为登录页首先要重定向到网站的主页而没有Thread.sleep(1000);它想要转到第二页,但登录页面拒绝它,因为它希望首先进入主页面。有人说,为什么Selenium会崩溃,或者你们在下面的例子中看到和奇怪地使用代码?
// Currently on a webpage
WebElement ui_login_button = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-login-button")));
ui_login_button.click();
//After the click it logs in and redirects to a webpage
Thread.sleep(1000); // why sleep here? (without this Selenium crashes)
// Go to second page and perform actions
waitForLoad(driver);
driver.navigate().to(URL + "/mymp/verkopen/index.html");
/* -------------------------------------------------------------------
public void waitForLoad(WebDriver driver) {
ExpectedCondition<Boolean> pageLoadCondition = new
ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
}
};
//WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(pageLoadCondition);
}
对不起解释,我尽力明白。英语不是我的母语。谢谢你的帮助。
亲切的regargds。
答案 0 :(得分:1)
根据您的问题和更新的评论它提出了一个例外,它无法在网页上找到该元素,这是非常有可能的。另外,当你提到在其间放置睡眠不是一个优雅的解决方案时,这非常正确,因为诱导Thread.sleep(1000);
会降低整体测试执行性能
现在,我在评论代码块中观察到的将document.readyState
与 complete
进行比较的步骤更为明智。但有时可能会发生这种情况,尽管由于存在 JavaScript 和 AJAX,Web浏览器会将document.readyState
作为 complete
发送给Selenium调用我们要与之互动的元素可能不是可见,可点击或可互动,这反过来可能会引发相关联的< EM>异常
因此,解决方案是诱导 ExplicitWait ,即 WebDriverWait 。我们将为我们想要与之交互的元素引入 ExplicitWait ,并设置正确的 ExpectedConditions 。您可以找到有关ExplicitWait here。
的文档如果您想等待按钮可点击,预期的代码块可能与导入一起采用以下格式:
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
// Go to second page and wait for the element
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.id("id_of_the_element")));
//perform actions
driver.navigate().to(URL + "/mymp/verkopen/index.html");
答案 1 :(得分:0)
我猜你在导航到网址+&#34; /mymp/verkopen/index.html"后引发异常;并开始采取一些行动。
我猜测这里的主要问题是你的waitForLoad()方法不等待一些Javascript或其他后台任务在Login首先登陆的页面上完成。因此,当您导航到下一页时,某些内容尚未完成,使您的用户身份验证处于错误状态。也许您需要在登录后等待一些AJAX完成才能继续进行导航?或者最好点击该页面上的链接来触发导航到目标页面(真实用户会这样做),而不是直接输入URL?您可能会发现与开发人员讨论Web应用程序的实际行为会很有帮助。
正如DebanjanB指出的那样,一旦您进入目标页面,就可以使用WebDriverWait获取您正在采取行动的页面上的元素。