1

我目前正在学习 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);
    }

抱歉解释,我尽力说清楚。英语不是我的母语。谢谢你的帮助。

亲切的问候。

4

2 回答 2

1

根据您的问题和更新的评论,它引发了一个异常,即在网页上找不到元素,这很有可能。此外,当您提到在两者之间设置 sleep 不是一个优雅的解决方案时,这是非常正确的,因为 inducingThread.sleep(1000);会降低整体Test Execution Performance

现在,我在您的注释代码块中观察到的比较document.readyStatecomplete一个更明智的步骤。但有时可能会发生这种情况,尽管 Web 浏览器将发送document.readyStatecompleteSelenium,但由于JavaScriptAJAX 调用的存在,我们想要与之交互的元素可能不是VisibleClickableInteractable,这反过来可能会引发相关的Exception

因此,解决方案将是诱导ExplicitWaitWebDriverWait。我们将为我们想要交互的元素引入ExplicitWait ,并设置适当的ExpectedConditions。您可以在此处找到有关ExplicitWait 的文档。

一个例子:

如果您想等待按钮可点击,预期的代码块可能与导入一起采用以下格式:

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");
于 2017-07-14T06:08:05.317 回答
0

我猜在您导航到 URL + "/mymp/verkopen/index.html" 并开始采取一些措施后会引发异常。

我推测这里的主要问题是您的 waitForLoad() 方法没有等待某些 Javascript 或其他后台任务在登录首先进入的页面上完成。因此,当您导航到下一页时,有些事情尚未完成,从而使您的用户身份验证处于错误状态。也许您需要在登录后等待一些 AJAX 完成,然后再继续您的进一步导航?或者最好单击该页面上的链接以触发导航到您的目标页面(就像真实用户一样),而不是直接输入 URL?您可能会发现与开发人员讨论 Web 应用程序的实际行为很有帮助。

正如 DebanjanB 所指出的,一旦您在目标页面上,您就可以将 WebDriverWait 用于您正在执行操作的页面上的元素。

于 2017-07-14T12:39:13.397 回答