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

如何告诉JavaSeleniumWebDriver在没有Thread.sleep()的情况下等待特定的时间段,java,selenium,Java,Selenium,我试图用Selenium、TestNG和Hamcrest编写一个简单的UI测试。问题是我用作测试平台的webshop(Opencart)使用相同的类在首页和搜索结果中显示特色产品。我的测试方法: @DataProvider(name = "searchDataIterator") public Iterator<Object> searchDataProviderWithIterator(){ return new ArrayList<Object>(Arr

我试图用Selenium、TestNG和Hamcrest编写一个简单的UI测试。问题是我用作测试平台的webshop(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)));
}
@DataProvider(name=“searchDataIterator”)
公共迭代器searchDataProviderWithIterator(){
返回新的ArrayList(Arrays.asList(“macbook”、“iphone”、“tv”、“诺基亚”、“帽子”))。迭代器();
}
@测试(groups=“generic”,dataProvider=“searchDataIterator”,优先级=4)
public void runSearchWithDataProvider(字符串searchData)引发InterruptedException{
driver.findelelement(By.cssSelector(“#搜索输入”)).clear();
driver.findelelement(By.cssSelector(“#搜索输入”)).sendKeys(searchData,Keys.ENTER);
睡眠(500);
断言(driver.findelelements(By.className(“产品拇指”)).size(),是(大于(0));
}

问题是如果我不使用Thread.sleep(500);行资产(driver.findElements(By.className(“product thumb”)).size(),是(大于(0));捕获首页的特色产品计数或以前搜索的结果。有人告诉我,使用Therad.sleep()是非常糟糕的做法,但是如果没有它,如何实现同样的效果?

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

List<WebElement> productThumbs = new WebDriverWait(driver, 500)
    .until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver driver) {
            return driver.findElements(By.className("product-thumb"));
        }
    });
assertThat(productThumbs.size(), is(greaterThan(0)));
List productThumbs=new-WebDriverWait(驱动程序,500)
.until(新函数(){
公共WebElement应用(WebDriver){
返回driver.findElements(按.className(“产品拇指”);
}
});
断言(productThumbs.size(),大于(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");
        }
    });
}
publicstaticvoid waitForPageToLoad(){
WebDriverWait wait=新的WebDriverWait(驱动程序,10);
等待.直到(新的ExpectedCondition(){
公共布尔应用(WebDriver wdriver){
return((JavascriptExecutor)driver.executeScript(“return document.readyState”).equals(“complete”);
}
});
}

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

  • 等待指示已发生结果转换的事件。不是结果本身,而是指示页面转换为搜索结果的某些元素

  • 在那之后,你可以像@Alan Barboza建议的那样等待/获得结果

  • 使用,步骤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 + "')]")));
    
    WebDriverWait wait=newwebdriverwait(驱动程序,10);
    //步骤1:等待页面导航到搜索结果
    //通过文本“搜索-[Search term]”标识
    等待。直到(预期条件。元素的存在)找到(
    xpath(“//h1[contains(text(),'Search-“+searchData+”)]”);
    
    另一个好处是,如果测试在这一步失败,您将知道实际原因:页面从未导航到搜索结果,而不是搜索未找到预期的产品。

    您可以导入

    import java.awt.Robot;
    
    并使用其延迟方法传递等待的毫秒数(ms)。 例如:

    机器人有一个最大延迟常量值,允许最多等待60秒

    private static final int MAX_DELAY = 60000;
    

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

    final int waitTime = 2000;
    waitABit(waitTime);
    

    使用如何?它不会编译,但如果我将其更改为:
    List productThumbs=new WebDriverWait(driver,500).until(new Function(){public List apply(WebDriver driver){return driver.findElements(By.className(“product thumb”);});         断言(productThumbs.size(),大于(0))它什么也不做
    
    final int waitTime = 2000;
    waitABit(waitTime);