放在单独的测试中时代码不执行 类
Code not executing when placed in separate test classes
我正在为一个使用 maven+TestNG 的网站编写一个 PageFactory
框架,
我有页面明智 PageObject
classes,其中存在特定于页面的所有 Web 元素和操作,如 LoginPageObject
、AccountSelectionPageObject
...
我有一个 class "Base",其中存在 WebDriver、Logger 等常见元素。
我有一个 class "BasePage",其中包含单击、滚动、select、刷新...等常见操作
MyTestng.xml 对所有单独的页面都有单独的 <class>
条目。
只是我在 @BeforeSuiit
中初始化浏览器对象,在 class 中初始化浏览器对象 class 它正在我的测试 classes 中扩展
下面是我为我的项目提出的 flow/arch。
问题:
我的每个测试 classes 中都有多个 @Test。
当我的测试 classes 被单独执行时,所有的 @Test 脚本都执行了,
但是当我连续执行它们时,即我的 testng 文件对我所有的测试 classes 都有单独的条目,我的执行失败了。错误说无法在页面上找到元素,我有等待语句,但仍然无法正常工作。
我试过调试代码,但无法找到原因,因为流程在第二页开始时停止,异常提示找不到元素
代码:
@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());
}
预计:
即使分开代码页,代码也应该完全执行。
实际:
当我在一个测试 class 中包含所有页面代码时,代码已执行。
但是,当我将它们分别放在页面测试 class 中时,抛出了找不到元素的异常。
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"listAccounts"}
在使用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());
}
}
克里希纳答案的补充:
PageFactory.initElements(driver, this);
上面的代码可以移到基础 class 和 LoginPage 中,您只需像这样在构造函数上传递 webdriver。
public class LoginPage extends Base {
public LoginPage(Webdriver driver) {
super(driver);
}
...
public class Base {
public Base(Webdriver driver) {
PageFactory.initElements(driver, this);
}
...
我正在为一个使用 maven+TestNG 的网站编写一个 PageFactory
框架,
我有页面明智 PageObject
classes,其中存在特定于页面的所有 Web 元素和操作,如 LoginPageObject
、AccountSelectionPageObject
...
我有一个 class "Base",其中存在 WebDriver、Logger 等常见元素。
我有一个 class "BasePage",其中包含单击、滚动、select、刷新...等常见操作
MyTestng.xml 对所有单独的页面都有单独的 <class>
条目。
只是我在 @BeforeSuiit
中初始化浏览器对象,在 class 中初始化浏览器对象 class 它正在我的测试 classes 中扩展
下面是我为我的项目提出的 flow/arch。
我的每个测试 classes 中都有多个 @Test。 当我的测试 classes 被单独执行时,所有的 @Test 脚本都执行了, 但是当我连续执行它们时,即我的 testng 文件对我所有的测试 classes 都有单独的条目,我的执行失败了。错误说无法在页面上找到元素,我有等待语句,但仍然无法正常工作。
我试过调试代码,但无法找到原因,因为流程在第二页开始时停止,异常提示找不到元素
代码:
@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());
}
预计:
即使分开代码页,代码也应该完全执行。
实际:
当我在一个测试 class 中包含所有页面代码时,代码已执行。
但是,当我将它们分别放在页面测试 class 中时,抛出了找不到元素的异常。
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"listAccounts"}
在使用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());
}
}
克里希纳答案的补充:
PageFactory.initElements(driver, this);
上面的代码可以移到基础 class 和 LoginPage 中,您只需像这样在构造函数上传递 webdriver。
public class LoginPage extends Base {
public LoginPage(Webdriver driver) {
super(driver);
}
...
public class Base {
public Base(Webdriver driver) {
PageFactory.initElements(driver, this);
}
...