问题描述:请求不同的url,跳转的登录页面不一致,在代码中想要用同一的方法去实现不同的url登录的操作。
解决思路:将登录的方法抽象出来以接口的形式给出,请求不同的url的时候,在具体的页面元素定位的类中(page页面)去实现这个接口,重写登录的方法。
具体的参考代码如下:
1.定义一个接口类,给出抽象的登录方法
//这个是定义的接口
public interface LoginInterface {
void login(String userName, String password);
}
2.在工具类中将不同请求url的登录方法统一为一个登录方法。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.PageFactory;
import java.util.concurrent.TimeUnit;
public class CommonUtils {
public static WebDriver driver;
public CommonUtils(WebDriver driver) {
this.driver = driver;
}
public void before() {
//获取当前运行的电脑的操作系统
String osName = System.getProperties().getProperty("os.name");
if(osName.contains("Windows")) {
//设置环境变量,指定chromedriver的路径
System.setProperty("webdriver.chrome.driver",
"src/test/resources/selenium/driver/243_69_71/chromedriver.exe");
} else if (osName.contains("Mac")) {
//设置环境变量,指定chromedriver的路径
System.setProperty("webdriver.chrome.driver",
"src/test/resources/selenium/driver/243_69_71/chromedriver");
} else {
System.out.println("找不到该操作系统下的浏览器驱动");
}
//设置浏览器参数
ChromeOptions options = new ChromeOptions();
//最大化浏览器
options.addArguments("--test-type","--start-maximized" ,"--disable-infobars");
//打开浏览器
driver = new ChromeDriver(options);
//隐式等待
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//线程等待
sleep(1);
}
public static <T extends LoginInterface> void login(String loginUrl, String loginName, String pwd, Class<T> clazz){
before() ;
//打开登录页面的请求地址
driver.get(loginUrl);
//clazz为要加载的登录页面的class文件
T loginPage = PageFactory.initElements(driver, clazz);
sleep(2);
//具体的登录页面的登录方法
loginPage.login(loginName, pwd);
sleep(5)
after();
}
public void after() {
//关闭浏览器
sleep(1);
driver.quit();
}
public static void sleep(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3.具体的登录页面的元素定位和操作元素的方法的类去实现定义的抽象接口
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class LoginPage implements LoginInterface {
//定位用户名输入框元素
@FindBy(xpath = "//input[@name='login']")
private WebElement loginName;
//定位密码输入框元素
@FindBy(xpath = "//input[@name='password']")
private WebElement loginPassword;
//定位登录按钮元素
@FindBy(xpath = "//button[text()='登 录']")
private WebElement loginBtn;
//登录方法
@Override
public void login(String userName, String password) {
loginName.sendKeys(userName);
loginPassword.sendKeys(password);
loginBtn.click();
}
}
网友评论