如何告诉JAVA Selenium WebDriver在没有Thread.sleep()的情况下等待特定的时间段

时间:2017-12-18 17:22:55

标签: java selenium

我试图用Selenium,TestNG和Hamcrest编写一个简单的UI测试。问题是我用作测试操场的网上商店(Opencart)使用相同的类在首页和搜索结果中显示特色产品。我的测试方法:

    @DataProvider(name = "searchDataIterator")
public Iterator<Object> searchDataProviderWithIterator(){
   return new ArrayList<Object>(Arrays.asList("macbook", "iphone", "tv", "nokia", "hat")).iterator();
}

@Test(groups = "generic", dataProvider = "searchDataIterator", priority = 4)
public void runSearchWithDataProvider(String searchData) throws InterruptedException {
    driver.findElement(By.cssSelector("#search input")).clear();
    driver.findElement(By.cssSelector("#search input")).sendKeys(searchData, Keys.ENTER);
    Thread.sleep(500);
    assertThat(driver.findElements(By.className("product-thumb")).size(), is(greaterThan(0)));
}

问题是,如果我不使用 Thread.sleep(500); 断言那个(driver.findElements(By.className(&#34; product-thumb& #34;))。size(),is(greaterThan(0))); 捕获首页的特色产品数或先前搜索的结果。有人告诉我,使用Therad.sleep()是非常糟糕的做法,但如果没有它,如何实现同样的目标呢?

5 个答案:

答案 0 :(得分:2)

我的建议是采用两阶段方法:

  1. 等待表明过渡到结果的内容。不是结果本身,而是一些表明页面已转换为搜索结果的元素。

  2. 之后,你可以自己等待/获得结果,比如@ Alan-Barboza建议

  3. 使用demo.opencart.com,第1步将如下所示:

    WebDriverWait wait = new WebDriverWait(driver, 10);
    
    // Step 1: wait for page to navigate to search results
    // identified by <h1> with text 'Search - [search term]'
    wait.until(ExpectedConditions.presenceOfElementLocated(
      By.xpath("//h1[contains(text(), 'Search - " + searchData + "')]")));
    

    奖励是如果测试在此步骤失败,您就会知道实际原因:页面从未导航到搜索结果,而搜索没有找到预期的产品。

答案 1 :(得分:0)

尝试使用代码,它将解决问题:

data.arrayresults.forEach {
    val result = it

    result.myData.let {
        val itemView - inflater.inflate(R.layout.somelayout)

        itemView.setOnClickListener(View.OnClickListener {

            // the it references the view but I want it to reference the result.myData
            SomeActivity.startActivity(context, it.id.toString())
        })
    }
}

答案 2 :(得分:0)

尝试以下代码,顾名思义,等待加载页面:

public static void waitForPageToLoad() {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(new ExpectedCondition<Boolean>() {

        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
        }
    });
}

答案 3 :(得分:0)

您可以导入

import java.awt.Robot;

并使用其延迟方法传递等待多少毫秒(ms)。 例如:

Robot robot = new Robot();
robot.delay(1000); // 1 SECOND

Robot具有MAX_DELAY常量值,允许最多等待60秒

private static final int MAX_DELAY = 60000;

答案 4 :(得分:0)

我也有同样的问题,我用waitABit方法解决了它;

final int waitTime = 2000;
waitABit(waitTime);