1、跨浏览器支持
(1)目录结构如下图:
(2)config.properties配置文件内容如下:(通过注释切换不同的浏览器)
# browser switcher
#browserName=Firefox
browserName=Chrome
#browserName=IE
#test server switcher
URL=http://www.jd.com
#URL=https://www.taobao.com
(2)浏览器引擎类(browserEngine)代码:
package Framwork;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
public class BrowserEngine {
public String browserName;
public String serverURL;
public WebDriver driver;
//获取配置文件的方法
public void initConfigData() throws IOException {
Properties p=new Properties();
InputStream ips=new FileInputStream(".\\TestConfig\\config.properties");
p.load(ips);
Logger.Output(LogType.LogTypeName.INFO, "Start to select browser name from properties file");
browserName=p.getProperty("browserName");
Logger.Output(LogType.LogTypeName.INFO, "Your had select test browser type is:"+browserName);
serverURL=p.getProperty("URL");
Logger.Output(LogType.LogTypeName.INFO, "The test server URL is:"+serverURL);
ips.close();
}
//初始化浏览器的方法
public WebDriver getBrowser() {
if(browserName.equalsIgnoreCase("Firefox")) {
System.setProperty("webdriver.gecko.driver", ".\\drivers\\geckodriver.exe");
driver=new FirefoxDriver();
Logger.Output(LogType.LogTypeName.INFO, "Launching Firefox...");
}
else if(browserName.equalsIgnoreCase("Chrome")) {
System.setProperty("webdriver.chrome.driver", ".\\drivers\\chromedriver01.exe");
driver=new ChromeDriver();
Logger.Output(LogType.LogTypeName.INFO, "Launching Chrome...");
}
else if(browserName.equalsIgnoreCase("IE")) {
System.setProperty("webdriver.ie.driver", ".\\drivers\\IEDriver.exe");
driver=new InternetExplorerDriver();
Logger.Output(LogType.LogTypeName.INFO, "Launching IE...");
}
driver.get(serverURL);
Logger.Output(LogType.LogTypeName.INFO, "Open URL:"+serverURL);
driver.manage().window().maximize();
Logger.Output(LogType.LogTypeName.INFO, "Maximize browser...");
callwait(5);
return driver;
}
//退出浏览器的方法
public void tearDown() throws InterruptedException {
Logger.Output(LogType.LogTypeName.INFO, "Closing browser...");
driver.quit();
Thread.sleep(3000);
}
//隐式时间等待方法
public void callwait(int time) {
driver.manage().timeouts().implicitlyWait(time,TimeUnit.SECONDS);
Logger.Output(LogType.LogTypeName.INFO, "wait for"+time+" seconds.");
}
//最大化浏览器
public void callmaxbrowser() {
driver.manage().window().maximize();
}
}
(3)测试页面类()代码:
package testSuite;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import java.io.IOException;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import Framwork.BrowserEngine;
public class TestLaunchBrowser {
public WebDriver driver;
@BeforeClass
public void setUp() throws IOException {
BrowserEngine browserEngine=new BrowserEngine();
browserEngine.initConfigData();
driver=browserEngine.getBrowser();
}
@Test
public void clickNews() {
driver.findElement(By.id("key")).sendKeys("iponeX");
driver.findElement(By.xpath("//div[@id='search']/div/div[2]/button")).click();
}
@AfterClass
public void tearDown() {
driver.quit();
}
}
注意:1、driver的传递,保证所有脚本只有一个唯一的driver; 2、该测试脚本还用到了Framwork包中两个java输出日志的类:Logger.java和LogType.java;
2、页面基类
(1)目录结构
代码如下:
package Framwork;
import java.util.Iterator;
import java.util.Set;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class BasePage {
public static WebDriver driver;
public static String pageTitle;
public static String pageUrl;
//构造方法
protected BasePage(WebDriver driver) {
BasePage.driver=driver;
}
//输入框中输入text方法
protected void type(WebElement element,String text) {
try {
if(element.isEnabled()) {
element.clear();
Logger.Output(LogType.LogTypeName.INFO, "Clean the value if any in"+element.toString()+".");
element.sendKeys(text);
Logger.Output(LogType.LogTypeName.INFO, "Type value is:"+text+".");
}
}catch(Exception e) {
Logger.Output(LogType.LogTypeName.ERROR, e.getMessage()+".");
}
}
//点击
protected void click(WebElement element) {
try {
if(element.isEnabled()) {
element.click();
Logger.Output(LogType.LogTypeName.INFO, "Element:"+element.toString()+"was clicked.");
}
}catch(Exception e){
Logger.Output(LogType.LogTypeName.ERROR, e.getMessage()+".");
}
}
//清除
protected void clean(WebElement element) {
try {
if(element.isEnabled()) {
element.clear();
Logger.Output(LogType.LogTypeName.INFO, "Element"+element.toString()+"was cleaned.");
}
}catch(Exception e) {
Logger.Output(LogType.LogTypeName.ERROR, e.getMessage()+".");
}
}
//判断页面元素是否在当前页面出现
protected void verifyElementIsPresent(WebElement element) {
try {
if(element.isDisplayed()) {
Logger.Output(LogType.LogTypeName.INFO,"This Element"+element.toString().trim()+"is present.");
}
}catch (Exception e) {
Logger.Output(LogType.LogTypeName.ERROR, e.getMessage()+".");
}
}
//当前页面的Title
protected String getCurrentPageTitle() {
pageTitle=driver.getTitle();
Logger.Output(LogType.LogTypeName.INFO,"Current page title is"+pageTitle);
return pageTitle;
}
//当前页面的Url
protected String getCurrentPageUrl() {
pageUrl=driver.getCurrentUrl();
Logger.Output(LogType.LogTypeName.INFO,"Current page Url is"+pageUrl);
return pageUrl;
}
//多窗口之间的切换
public void switchWindwo() {
String currentWindow=driver.getWindowHandle();//获取当前窗口句柄
Set<String> handles=driver.getWindowHandles();//获取所有窗口句柄
Logger.Output(LogType.LogTypeName.INFO,"当前窗口数量:"+handles.size());
Iterator<String> it=handles.iterator();
while(it.hasNext()) {
if(currentWindow==it.next()) {
continue;
}
try {
driver.close();//关闭旧窗口
WebDriver window=driver.switchTo().window(it.next());//切换到新窗口
Logger.Output(LogType.LogTypeName.INFO,"new page title is"+window.getTitle());
}catch(Exception e) {
Logger.Output(LogType.LogTypeName.ERROR,"切换到新打开窗口"+e.getMessage());
}
//driver.close();//关闭当前焦点所在的窗口
}
//driver.switchTo().window(currentWindow);//回到原来页面
}
}
3、实现POM和测试页面基类: