如何告诉JavaSeleniumWebDriver在没有Thread.sleep()的情况下等待特定的时间段
我试图用Selenium、TestNG和Hamcrest编写一个简单的UI测试。问题是我用作测试平台的webshop(Opencart)使用相同的类在首页和搜索结果中显示特色产品。我的测试方法:如何告诉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
@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”);
}
});
}
我的建议是使用两阶段方法:
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);