我写了一些代码比较价格从网站与csv文件,我的测试工作良好,但它需要很长的时间(1分钟)。在找到网页中的每一个元素之前,我使用了睡眠。您是否有其他方法编写此测试以更快地运行代码,使用此方法加载每个价格并与csv文件中的价格进行比较需要1秒。另一方面,如果没有睡眠,我的代码将无法工作,因为加载页面和查找元素。
public class TestBikeInsurancePrice extends HepsterTest {
private void prepareTest() {
initiateBrowserWebShop();
var url = baseUrl + "/fahrradversicherung-test-2020";
driver.get(url);
handleCookie(driver);
}
@Test(priority = 1)
void checkBeschädigung() throws FileNotFoundException {
prepareTest();
List<CsvPrice> stuff = readFromCSV("resources/price/Test Fahrradversicherung Upload.csv");
stuff.forEach(csvPrice -> {
System.out.println(csvPrice.getQualityName() + " " + csvPrice.getCoverageSum() + " " + csvPrice.getDurationTimeUnit() + " " + csvPrice.getDurationRiskPremium());
Select price = new Select(driver.findElement(By.id("coverageSum")));
price.selectByValue(csvPrice.getCoverageSum().toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String qualityName;
if (csvPrice.getQualityName().equals("Diebstahl")) qualityName = "Nur Diebstahl";
else qualityName = csvPrice.getQualityName();
driver.findElement(By.xpath("//*[contains(text(),'" + qualityName + "')]")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String duration;
if (!csvPrice.getDurationTimeUnit().equals("MONTHS")) duration = "Preisvorteil";
else duration = "flexibel, mtl. kündbar";
driver.findElement(By.xpath("//*[contains(text(),'" + duration + "')]")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
WebElement priceElement = driver.findElement(By.xpath("//*[@id='product-configurator-spinner']//parent::span"));
String priceAsString = priceElement.getText().split(" ")[0];
System.out.println(priceAsString);
Assert.assertEquals(csvPrice.getPriceBasePrice().setScale(2), new BigDecimal(priceAsString.replace(",", ".")).setScale(2));
});
}
2条答案
按热度按时间wvmv3b1j1#
显式等待:对于命令式、过程式语言,selenium客户端可以使用显式等待。它们允许您的代码暂停程序执行或冻结线程,直到您传递的条件解决为止。以特定频率调用条件,直到等待超时结束。这意味着只要条件返回错误值,它就会继续尝试和等待。
我在代码中添加了显式等待。
u0njafvf2#
使用时的实际问题:
Thread.sleep()
thread.sleep()被认为是显式等待的最坏情况,因为它必须等待指定为thread.sleep(3000)参数的完整时间,然后才能继续。结果,下一步不得不等待整个过程结束。
解决方案:更改
Thread.sleep()
进入explicit wait
.在selenium中,在这种情况下,“等待”很方便,或者在执行测试时扮演重要角色。
selenium中有三种类型的wait。
隐式等待:在隐式等待中,webdriver在试图查找任何元素时轮询dom一段时间。当网页上的某些元素不能立即使用并且需要一些时间来加载时,这可能非常有用。
代码:
显式等待显式等待允许我们的代码暂停程序执行或冻结线程,直到您传递的条件解决为止。以特定频率调用条件,直到等待超时结束。这意味着只要条件返回错误值,它就会继续尝试和等待。
代码:
fluentwait:fluentwait示例定义等待条件的最长时间,以及检查条件的频率。
代码:
裁判:
https://www.selenium.dev/documentation/en/webdriver/waits/
https://www.browserstack.com/guide/wait-commands-in-selenium-webdriver