如何在Selenium-java中将页面对象与代码逻辑分离
我正在学习并尝试在selenium中将定位器与实际代码分开。我已经将它们分开了,但我需要更多优化方面的指导,我如何才能对代码进行更多优化?页面对象设计模型是否仅用于存储定位器?或者我们也可以存储他们的方法。有人能解释一下下面的代码吗 链接: 使用LogicTC_01Test.java和Base.java类初始化驱动程序的实际代码 下面是为上述测试用例创建的页面ObjectTC_01.java的代码如何在Selenium-java中将页面对象与代码逻辑分离,java,selenium,selenium-webdriver,pageobjects,Java,Selenium,Selenium Webdriver,Pageobjects,我正在学习并尝试在selenium中将定位器与实际代码分开。我已经将它们分开了,但我需要更多优化方面的指导,我如何才能对代码进行更多优化?页面对象设计模型是否仅用于存储定位器?或者我们也可以存储他们的方法。有人能解释一下下面的代码吗 链接: 使用LogicTC_01Test.java和Base.java类初始化驱动程序的实际代码 下面是为上述测试用例创建的页面ObjectTC_01.java的代码 回答您的问题-是的,您也可以在PO类中存储方法。此外,这是一个很好的做法。 关于代码优化,最好是表
回答您的问题-是的,您也可以在PO类中存储方法。此外,这是一个很好的做法。 关于代码优化,最好是表达业务行为,而不是细粒度的技术操作。另外,您可以简单地在PO类中执行这些操作,而不是返回WebElement方法,然后在测试类中单击、发送键等执行操作。 检查下面的代码
public void enterFirstName() {
driver.findElement(firstName).sendKeys("abc");
}
public void enterLastName() {
driver.findElement(lastName).sendKeys("qwerty");
}
public void pressSubmitButton() {
driver.findElement(submitButton).click();
}
// instead of invocation all of these methods above in test class you can simply do this:
public void loginWithValidCredentials(String firstNameValue, String lastNameValue) {
driver.findElement(firstName).sendKeys(firstNameValue);
driver.findElement(lastName).sendKeys(lastNameValue);
driver.findElement(submitButton).click();
}
// Thus your test will look like:
@Test
public void loginTest() {
POclass po = new POclass();
po.loginWithValidCredentials("yourName", "yourNameABC");
// some assert() methods...
}
这要简单得多。
顺便说一句,了解和使用PageFactory概念很有用-
注意-阅读责任链模式,但如果你对Java很精通,因为这是一个非常高级的主题。这很有帮助,只想知道一件事-那么页面对象类文件中是否包括切换到框架、窗口句柄、迭代不同窗口选项卡等方法?@AniketWarade yeah,这将是一个很好的做法。基本上,您需要隐藏PO及其方法中的所有技术细节,因为它只允许您在测试中调用业务逻辑方法。
public class TC_01 {
WebDriver driver;
public TC_01(WebDriver driver) {
this.driver = driver;
}
// driver.findElement(By.xpath("//a[@id='get_sign_in']"))
// mobileNumber= driver.findElement(By.xpath("//input[@id='authMobile']")
// driver.findElement(By.id("mobileSubmitBtn"))
// driver.findElement(By.xpath("//div[@class='popContent']/a"))
By signinLink = By.xpath("//a[@id='get_sign_in']");
By signupLink = By.xpath("//a[@id='get_sign_up']");
By mobileNumber = By.xpath("//input[@id='authMobile']");
By submitButton = By.id("mobileSubmitBtn");
By closePopup = By.xpath("//div[@class='popContent']/a");
public WebElement siginLink() {
return driver.findElement(signinLink);
}
public WebElement sigupLink() {
return driver.findElement(signupLink);
}
public WebElement mobileNumber() {
return driver.findElement(mobileNumber);
}
public WebElement submitButton() {
return driver.findElement(submitButton);
}
public WebElement closePopup() {
return driver.findElement(closePopup);
}
}
public void enterFirstName() {
driver.findElement(firstName).sendKeys("abc");
}
public void enterLastName() {
driver.findElement(lastName).sendKeys("qwerty");
}
public void pressSubmitButton() {
driver.findElement(submitButton).click();
}
// instead of invocation all of these methods above in test class you can simply do this:
public void loginWithValidCredentials(String firstNameValue, String lastNameValue) {
driver.findElement(firstName).sendKeys(firstNameValue);
driver.findElement(lastName).sendKeys(lastNameValue);
driver.findElement(submitButton).click();
}
// Thus your test will look like:
@Test
public void loginTest() {
POclass po = new POclass();
po.loginWithValidCredentials("yourName", "yourNameABC");
// some assert() methods...
}