在geb自动化测试中使用waitFor {}和sleep()的最佳做法是什么?

时间:2016-03-31 14:36:53

标签: selenium automated-tests geb

目前正在学习如何使用geb编写自动化测试,因此这可能是一个noob观察和问题。是仅仅是我还是一个接一个地运行许多测试似乎加快了测试的执行速度?例如,在编写新测试时,我会注释掉我的其他测试,只是运行一个或两个方法以确保其正常工作。一切都会顺利通过。然后,当我取消注释所有内容以运行完整测试时,测试似乎运行得非常快,并且我自动化的Web应用程序无法跟上,并且由于元素未加载而导致我的测试失败。即使使用waitFor{}块。我发现在某些地方使用sleep(1000)有所帮助,但我觉得可能有更好的方法来解决这个问题。我正在使用的Web应用程序似乎每当用户对字段进行任何操作时都会刷新页面,这可能是我无法控制的问题的一部分。在我的测试的一个部分,我需要填写一个表单,但填写输入后页面刷新,所以我写了下面的代码,但由于所有的睡眠声明,看起来有点meh。

void populateRequiredFields(){
    def fName = "Test"
    def lName = "User"
    def email = "abc@abc.com"
    def question = "Do you even test bro?"

    clear.click()
    //sleep() to slow down test in order to get correct elements due to page refreshing
    sleep(3000)
    firstName << fName
    sleep(1000)
    lastName << lName
    sleep(1000)
    emailAddress << email
    sleep(1000)
    veryifyEmail << email
    sleep(1000)
    questionField << question
    sleep(1000)
}

3 个答案:

答案 0 :(得分:1)

我发现,在page objectsmodules上的方法内执行典型的异步操作后,最好将逻辑放在等待页面处于预期状态的逻辑中。通过这种方式,您不会在所有waitFor {}噪音中丢失测试,并且当您添加更多测试时,您不会忘记等待,因为等待是可重用逻辑的一部分。

所以在你的情况下:

import geb.Page

class APageThatCanBeCleared extends Page {

    static content = {
        clear { $(/*whatever the selector for the clearing element is*/) }
        firstName { $(/*whatever the selector for the first name element is*/) }
    }

    void clear() {
        clear.click()
        waitFor { firstName.displayed } 
    }
}

然后在你的测试中:

to APageThatCanBeCleared
clear()
firstName << "Test"

答案 1 :(得分:1)

如果你需要等待的时间超过waitFor提供的标准10秒,你可以这样做:

waitFor(30, 0.5){ firstName << fName }

这将等待30秒并每半秒检查一次。

答案 2 :(得分:0)

使用sleep()不是一个好主意。尝试使用waitFor {存在一些结果}