我正在使用maven + TestNG来为网站安装PageFactory
框架,
我有按页显示的PageObject
类,其中显示了所有针对该页面的Web元素和操作,例如LoginPageObject
,AccountSelectionPageObject
...
我有一个“基础”类,其中存在诸如WebDriver,Logger之类的常见元素。
我有一个“ BasePage”类,其中包含单击,滚动,选择,刷新...等常见操作
MyTestng.xml对所有单个页面都有单独的<class>
条目。
只是我正在初始化@BeforeSuiit
中的浏览器对象,并将其存储/放置在Base类中,该类在我的Test类中进行了扩展
以下是我为项目准备的流程/架构。
问题:
每个测试类中都有多个@Test。 当我的Test类分别执行时,所有@Test脚本都将执行, 但是当我连续执行它们时,即我的testng文件对我所有的测试类都有单独的条目,执行失败。错误提示无法在页面上找到元素,我有等待语句,但仍然无法正常工作。
我已经尝试调试代码,但是由于流程在第二页开始时停止,但找不到元素
,因此无法找到原因代码:
@FindBy(id="listAccounts")
WebElement accountDropdown;
public void selectAccount(){
logger.info("Selecting Account");
implicitwait(10);
Select dropdown = new Select(accountDropdown);
logger.info("Drop down is multiple::"+ dropdown.isMultiple());
}
预期:
即使在分开的代码页中,代码也应完全执行。
实际:
当我将所有页面代码都放在一个测试类中时,将执行代码。
但是,当我将它们分别放置在逐页测试类中时,将引发未找到元素异常。
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"listAccounts"}
答案 0 :(得分:0)
在使用PageFactory框架的POM中,应该在PageClasses的Constructor中初始化PageFactory。请在下面找到适合您的情况的代码段。
public class LoginPage extends TestBase {
public LoginPage() {
PageFactory.initElements(driver, this);//Here driver is initialised in TestBase class and inherited in LoginPage class
}
//your code
@FindBy(id="listAccounts")
WebElement accountDropdown;
public void selectAccount(){
logger.info("Selecting Account");
implicitwait(10);
Select dropdown = new Select(accountDropdown);
logger.info("Drop down is multiple::"+ dropdown.isMultiple());
}
}
答案 1 :(得分:0)
奎师那答案的补充:
PageFactory.initElements(driver, this);
可以将上面的代码移至基类,并从LoginPage中移出,只需将Webdriver传递给构造函数即可。
public class LoginPage extends Base {
public LoginPage(Webdriver driver) {
super(driver);
}
...
public class Base {
public Base(Webdriver driver) {
PageFactory.initElements(driver, this);
}
...