在进入下一页之前,Selenium需要睡一觉

时间:2017-07-13 17:49:27

标签: java multithreading selenium webdriver

我目前正在学习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。

2 个答案:

答案 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获取您正在采取行动的页面上的元素。