我试图用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()是非常糟糕的做法,但如果没有它,如何实现同样的目标呢?
答案 0 :(得分:2)
我的建议是采用两阶段方法:
等待表明过渡到结果的内容。不是结果本身,而是一些表明页面已转换为搜索结果的元素。
之后,你可以自己等待/获得结果,比如@ Alan-Barboza建议
使用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);