我很少有明确等待硒测试的测试。
我用得太多了。我想将它移动到基类并每次创建新对象时剪切:
新的WebDriverWait(...)
现在 下一步 :
public void logOutUser() {
new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.xpath("//span[@class='gb_W gbii']")));
userOptionsMenu.click();
new WebDriverWait(driver, 30).until(presenceOfElementLocated(By.xpath("//div/a[@id='gb_71']")));
signOutLink.click();
}
我想将它移到Base类,并绕过冗余对象创建。
基类 :
public class AndroidBasePage implements IPage {
protected WebDriver driver = null;
private WebDriverWait driverWait;
public AndroidBasePage() {
driver = SeleniumManager.activeBrowser();
}
@Override
public WebDriver getDriver() {
return driver;
}
public WebDriverWait getWait() {
if (driverWait == null) {
driverWait = new WebDriverWait(driver, 30);
}
return driverWait;
}
protected void driverWaitPresenceOfElement(String xpath) {
getWait().until(presenceOfElementLocated(By.xpath(xpath)));
}
}
现在可以使用 :
public void logOutUser() {
driverWaitPresenceOfElement("//span[@class='gb_W gbii']");
userOptionsMenu.click();
driverWaitPresenceOfElement("//div/a[@id='gb_71']");
signOutLink.click();
}
但我不确定它的效率。任何建议。
是否存在使getWait()
静态的某种方式?
答案 0 :(得分:0)
我们在Selenium webdriver项目(非Android)中做了类似的事情。使用抽象超类。其中一个功能是getElement(String id/Xpath/name etc)
,它会隐式提供等待。
对于您的情况我想知道您为什么需要工厂方法?而是让它成为对象实例化的一部分(等待需要你的确切驱动程序实例)。略微修改你的课程:
public class AndroidBasePage implements IPage {
protected WebDriver driver;
private WebDriverWait driverWait;
public AndroidBasePage() {
driver = SeleniumManager.activeBrowser();
//only one driverwait for a page instance
driverWait = new WebDriverWait(driver, 30);//time should be configurable
}
@Override
public WebDriver getDriver() {
return driver;
}
protected void driverWaitPresenceOfElement(String xpath) {
driverWait.until(presenceOfElementLocated(By.xpath(xpath)));
}
}
答案 1 :(得分:0)
我发现你有30秒的固定等待时间。在调用Web驱动程序初始化后使用隐式等待是否更好?
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);