我正在使用 Perl 和 Selenium 构建一个测试自动化项目。我正在使用页面对象模型。我有点不确定 Selenium 驱动程序在哪里适合页面对象模型的实现。
每个页面对象都应该“有”一个驱动程序吗?我的想法是每个页面对象代表页面提供给用户的一组服务。考虑到这个概念,页面对象与驱动程序没有“具有”关系。页面对象与驱动程序交互。但是,我仍在寻找建议。我应该将驱动程序作为 Web 应用程序中每个页面对象的一部分吗?
谢谢!
我正在使用 Perl 和 Selenium 构建一个测试自动化项目。我正在使用页面对象模型。我有点不确定 Selenium 驱动程序在哪里适合页面对象模型的实现。
每个页面对象都应该“有”一个驱动程序吗?我的想法是每个页面对象代表页面提供给用户的一组服务。考虑到这个概念,页面对象与驱动程序没有“具有”关系。页面对象与驱动程序交互。但是,我仍在寻找建议。我应该将驱动程序作为 Web 应用程序中每个页面对象的一部分吗?
谢谢!
这个答案与@zodvik 和您的思考过程没有太大区别,但它是另一种可选方法。您可以创建一个抽象类,而不是传递驱动程序,然后每个页面对象都可以从该类继承。从抽象类中,还可以包含一些您会发现自己经常使用的常用功能方法。
这至少是我在 Java 语言中的做法。
我总是将驱动程序作为每个页面对象的一部分。我对驱动程序的看法是它代表当前页面的状态。它提供对 URL、页面源等的访问权限。
现在,每个页面都有一个当前 URL、一个页面源代码、一个页面标题,这些都可以通过驱动程序访问。
顺便说一句,我实现了框架。我在包含常用元素的 commonFactory.class 中使用了驱动程序。每个页面都作为 commonFactory.class 的子类实现。所以你不必在每个类中实现驱动程序。由于驱动程序独立于测试场景,因此最好以单独的方式拥有它。
据我了解,没有实施 POM 的既定规则/标准。
但是,一般的经验法则是在您的框架中创建一个 BaseTest 和 BasePage 类,其中每个网页(如登录)将由其 PageClass(LoginPage) 表示。同样,您的所有 Page 类都将扩展您的 BasePage,所有测试都将扩展您的 BaseTest 类。
以下是其实现的粗略想法->
public class BaseTest{
@BeforeSuite()
setupMethod(){
initialize your WebDriver here
}
}
------------------------------------------
public class BasePage {
//create constructor
public BasePage(WebDriver driver) {
this.driver = driver;
this.wait = new WebDriverWait(this.driver, Duration.ofSeconds(TIMEOUT));
PageFactory.initElements(new AjaxElementLocatorFactory(this.driver, TIMEOUT), this);
}
//other common methods which can be utilized in your respective child Page classes
}
----------------------------------------------------
public class LoginPage extends BasePage {
//Your Locators and Weblelements
private static final LOGIN_ID = "login";
//Constructor to supply webdriver
public LoginPage(WebDriver driver) {
super(driver);
}
//your action methods
public void loginToApp(){
driver.findbyelement(By.ID(LOGIN_ID)).click
}
}
----------------------------------------------------
public class LoginTest extends BaseTest{
public LoginPage login;
BeforeAll()
{
login = new LoginPage(driver);
}
@Test
public void verifyLogin(){
login.loginToApp();
}
}