【问题标题】:How to replace Wait instant of Thread.sleep() in my automation test script如何在我的自动化测试脚本中替换 Thread.sleep() 的等待时刻
【发布时间】:2018-06-18 11:13:58
【问题描述】:

我是自动化的新手,我已经使用 JUnit 开发了使用 selenium webdriver 的自动化测试脚本,这是我的要求

我已经开发了自动化测试脚本。对于我的代码上的一些操作,我需要一些时间来执行下一个命令,比如查找元素并加载页面,所以我使用 Thread.sleep()。所以现在我发现关于使用 Thread.sleep 的信息不适合制作测试脚本

所以我的问题是谁能说我如何给我的代码动态等待时间我的代码如下,

System.setProperty("webdriver.chrome.driver", "//path of the chrome driver");
driver = new ChromeDriver();

driver.get("https://url for my org");
Thread.sleep(5000); //to load the login page of my Org
driver.findElement(By.xpath("my login xpath")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("my login xpath")).sendKeys("username");
Thread.sleep(2000);
driver.findElement(By.xpath("my password xpath")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("my password xpath")).sendKeys("my password");
driver.findElement(By.xpath("login button")).click();
Thread.sleep(6000); //for giving the time to login Org

我根据我的要求在我的代码上使用了不同类型的等待时间。 如果我去等待类我能达到相同的等待时间吗 那里?

对于获得显式等待,我的问题是不同的,如果我们定义如下,则为不同的地方提供恒定的等待时间,

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.click();
//for another wait 
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.sendKeys("something"); //Here it's wait time(10 seconds) is same to the after the click action wait time. 

那么,为什么我在没有必要的情况下在同一时间等待所有等待部分?如果有其他方法请告诉我?

如果我错了,请纠正我。

谢谢。

【问题讨论】:

  • 你可以把你的 driver.findElement 放到一个线程中,你可以加入到主线程中
  • @mBogaz 感谢您的回复。而且我是自动化的新蜜蜂,我不明白你的意思。我如何让我的 driver.findElement 成为主线程。 :(
  • @mBogaz 严重不明白你的答案:(我问如何给我的代码不同的等待时间。所以你能对你发布的答案做一些解释吗。
  • 编辑了我的帖子。

标签: java multithreading selenium selenium-webdriver junit


【解决方案1】:

首先,我非常想建议您使用页面对象或类似的东西。这会让你陷入维护地狱。话虽如此,要解决您的问题,您可以使用隐式或显式等待,以最适合您的方式。

如果要使用隐式等待,在初始化驱动程序时,请使用:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

如果您想使用显式等待,请使用此示例并将其设为您自己的:

WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement element = 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("xpath")));

element.click();

在这两个示例中,驱动程序最多会等待 10 秒。 如果您想知道两者之间的区别,请查看链接,看看哪种最适合您

http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/

【讨论】:

    【解决方案2】:

    由于 Selenium 贡献者的建议,您应该避免使用隐式等待。您还应该避免混合隐式和显式等待,如in the Selenium docs 所述:

    警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。

    您应该改用显式等待,例如WebDriverWait。在将数据输入字段之间不需要等待。我的一般方法是等待特定元素在页面上可见,表明页面已完成加载。在加载/动态部分较长的情况下,您将需要选择要加载到页面上的最后一个元素。加载该元素后,您可以在页面上随意输入文本等。您唯一需要在同一页面上再次等待的情况是,如果您触发了一些动态行为,例如单击刷新页面部分的链接、从触发重新加载另一个下拉列表的下拉列表中进行选择等。

    您的代码应该看起来更像

    driver.get("https://url for my org");
    driver.findElement(By.xpath("my login xpath")).sendKeys("username");
    driver.findElement(By.xpath("my password xpath")).sendKeys("my password");
    driver.findElement(By.xpath("login button")).click();
    // wait for element on newly loaded page and continue
    
    1. 导航到 URL 后无需等待。 Selenium 将等待浏览器 readyState 变为 complete

    2. 在使用.sendKeys()之前,您无需单击元素。

    3. 在将数据输入字段之间(通常)不需要等待。

    【讨论】:

    • 感谢有关 selenese 命令等待时间的信息。
    【解决方案3】:

    您应该在程序中添加隐式等待,如下所示

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.get("https://url for my org");
    

    这里的隐式等待基本上是您告诉 WebDriver 它应该等待 10 秒(如代码中所述)的方式,以防指定元素在 UI (DOM) 上不可用,即在抛出异常之前它将等待 10 秒。

    添加隐式等待后,删除所有 Thread.sleep(1000)。在每条语句之后编写 Thread.sleep(1000) 并不是一个好习惯。

    或者你可以使用显式等待

    // Create object of WebDriverWait class
    WebDriverWait wait=new WebDriverWait(driver,20);    
    // Wait till the element is not visible    
    WebElement element=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("ur xpath here")));
    boolean status = element.isDisplayed();
    //Then perform other action on element
    

    这会在抛出 TimeoutException 之前等待最多 20 秒,或者如果它发现元素将在 0 - 20 秒内返回它。默认情况下,WebDriverWait 每 500 毫秒调用一次 ExpectedCondition,直到它成功返回。对于 ExpectedCondition 类型的成功返回是 Boolean 对所有其他 ExpectedCondition 类型返回 true 或非 null 返回值。

    【讨论】:

    • 感谢明确回复以正确理解答案:)
    • 这不是一个好的做法。 Selenium 贡献者特别声明不要使用隐式等待,Selenium 文档特别声明不要像您建议的那样混合隐式和显式等待。您应该根据需要使用显式等待。
    • @JeffC 我已编辑我的回复以使用隐式或显式等待。我在我的程序中都使用过,并且运行良好,但感谢您指出这不是一个好的做法,可能会导致问题
    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多