我听说将WebDriver实例和方法设置为静态是不好的做法。 我从代码中删除了它,但是现在出现了问题: 我在方法:“ setLoginAndPassword()”的类“ LoginPage.java”中遇到错误:
该类型的方法setValueInField(By,String)未定义 登录页面
和:
对于LoginPage类型,方法clickIn(By)未定义
如何解决?也许继承?但是Java不支持多重继承(类LoginPage.java必须扩展ClickFunctions和InputFunctions
我的代码: 包:utils,类:Initialize.java:
public class Initialize {
protected WebDriver driver;
@BeforeClass
public void setUp(){
System.setProperty("webdriver.gecko.driver", "c:\\tests\\geckodriver.exe");
driver = new FirefoxDriver();
}
}
包:test,类:MainTests.java
public class MainTests extends Initialize{
@Test
public void test(){
LoginPage loginPage = new LoginPage(driver);
loginPage.getLoginPage();
HomePage homePage = loginPage.setLoginAndPassword();
}
}
包:pageobjects,类:LoginPage.java:
public class LoginPage{
public LoginPage(WebDriver driver){
this.driver = driver;
}
private WebDriver driver;
private By login = By.cssSelector("#Login");
private By password = By.cssSelector("#Password");
private By submit = By.cssSelector("#submit");
public LoginPage getLoginPage(){
driver.get("https://verytest.pl");
return this;
}
public HomePage setLoginAndPassword(){
setValueInField(login,"anylogin");
setValueInField(password,"anypass");
clickIn(submit);
return new HomePage(driver);
}
}
包:函数,类:ClickFunctions.java:
public class ClickFunctions extends Initialize{
public void clickIn(By locator){
new WebDriverWait(driver,120).until(ExpectedConditions.elementToBeClickable(locator));
driver.findElement(locator).click();
}
}
包:函数,类:InputFunctions.java:
public class InputFuntions extends Initialize{
public void setValueInField(By locator, String fieldValue){
new WebDriverWait(driver,120).until(ExpectedConditions.visibilityOfElementLocated(locator));
driver.findElement(locator).sendKeys(fieldValue);
}
}
答案 0 :(得分:0)
您可以将InputFunctions或ClickFunctions重构为实用程序类(然后无需扩展Initialize)。
示例
public class InputFuntions {
public static void setValueInField(WebDriver driver, By locator, String fieldValue){
new WebDriverWait(driver,120).until(ExpectedConditions.visibilityOfElementLocated(locator));
driver.findElement(locator).sendKeys(fieldValue);
}
}
然后您可以静态导入并使用它
import static my.package.InputFuntions.*
public class LoginPage{
public LoginPage(WebDriver driver){
this.driver = driver;
}
private WebDriver driver;
private By login = By.cssSelector("#Login");
private By password = By.cssSelector("#Password");
private By submit = By.cssSelector("#submit");
public LoginPage getLoginPage(){
driver.get("https://verytest.pl");
return this;
}
public HomePage setLoginAndPassword(){
setValueInField(driver, login,"anylogin");
setValueInField(driver, password,"anypass");
clickIn(driver,submit);
return new HomePage(driver);
}
}
如果每次添加驱动程序都很繁琐,则可以为页面创建基类并定义其中的每个实用程序。
示例
public class Page {
protected Webdriver driver;
public void setValueInField(By locator, String fieldValue){
new WebDriverWait(driver,120).until(ExpectedConditions.visibilityOfElementLocated(locator));
driver.findElement(locator).sendKeys(fieldValue);
}
// add other method here
}
示例用法
public class LoginPage extends Page{
public LoginPage(WebDriver driver){
this.driver = driver;
}
private WebDriver driver;
private By login = By.cssSelector("#Login");
private By password = By.cssSelector("#Password");
private By submit = By.cssSelector("#submit");
public LoginPage getLoginPage(){
driver.get("https://verytest.pl");
return this;
}
public HomePage setLoginAndPassword(){
setValueInField(login,"anylogin");
setValueInField(password,"anypass");
clickIn(submit);
return new HomePage(driver);
}
}
最后,您还可以使用Java 8默认方法。通过将每个实用程序类定义为具有默认方法(例如clickIn)和一个getDriver()的接口,可以使用这些实用程序通过页面来实现。 (这是一种多重继承)。