我试图为Web应用程序创建一个框架(Selenium + TestNg + java)(环境为MacOs + ChromeDriver,驱动程序服务器位于\ usr \ local \ bin中),但陷入了基本结构。我有一个启动浏览器的类(Driversetup.java),另一个包含WebElements和方法(ProfileUpdateObjects.java)的类,第三个包含测试方法的类。现在,当我尝试仅使用一个方法来运行该TestNG类时,就会出现以下异常。
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:138).
下面是代码(所有类都在不同的程序包中)。
public class ProfileUpdateTest {
@Test(enabled = true, priority = 1)
public void profileUpdate() throws MalformedURLException, InterruptedException, ParseException {
WebDriver driver = DriverSetup.startBrowser("chrome");
ProfileUpdateObjects pu = PageFactory.initElements(driver, ProfileUpdateObjects.class);
pu.navigateProfile();
}
}
ProfileUpdateObject类的代码
public class ProfileUpdateObjects {
WebDriver driver;
public ProfileUpdateObjects(WebDriver cdriver) {
this.driver = cdriver;
}
@FindBy(xpath = " //div[@class='ico-menu']")
private WebElement menu;
@FindBy(xpath = "//a[@title='My Dashboard']")
private WebElement myDashboard;
@FindBy(xpath = " //a[contains(text(),'View Profile')]")
public WebElement profile;
@FindBy(xpath = "//li[contains(text(),'Permanent Address')]")
private WebElement permanentAddress;
@FindBy(xpath = "//li[contains(text(),'Banking Information')]")
private WebElement bankingInformation;
WebDriverWait waitfor = new WebDriverWait(driver, 2000);
public void navigateProfile() throws InterruptedException {
menu.click();
profile.click();
waitfor.until(ExpectedConditions.visibilityOf(permanentAddress));
}
}
DriverSetup.java
public class DriverSetup {
public static WebDriver driver;
public static WebDriver startBrowser(String browserName, String url) {
if (browserName.equalsIgnoreCase("chrome")) {
driver = new ChromeDriver();
}
driver.manage().window().maximize();
driver.get(url);
return driver;
}
}
在pu.navigateProfile()调用中失败。而且,与驱动程序.find()语法相比,@ FindBy占用更多的内存是正确的,并且POM之外还有自动化框架的其他任何设计原则,因为Web上的大多数资源都是POM的一种或另一种实现。
答案 0 :(得分:0)
简单的解决方案是移动new WebDriverWait
。不应将其实例化为实例变量。
代替:
WebDriverWait waitfor = new WebDriverWait(driver, 2000);
public void navigateProfile() throws InterruptedException {
menu.click();
profile.click();
waitfor.until(ExpectedConditions.visibilityOf(permanentAddress));
}
使用:
public void navigateProfile() {
menu.click();
profile.click();
new WebDriverWait(driver, 2000).until(ExpectedConditions.visibilityOf(permanentAddress));
}
这将解决您的问题(已测试)