那么怎么獲取page的class路徑?
可以通過(guò)反射機(jī)制獲。
locatorMap = xmlUtils.readXMLDocument(path,
this.getClass().getCanonicalName());
這樣每次只按照page對(duì)象去加載其頁(yè)面的Locator對(duì)象,而不是一次性全部加載到內(nèi)存
hashMap可以通過(guò)key去獲取Locator,這樣也是極好的,比之前二維數(shù)組全部遍歷好多了
封裝一個(gè)basePage去處理Locator對(duì)象
package com.dbyl.libarary.utils;
import java.io.IOException;
import java.util.HashMap;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
public class BasePage {
protected WebDriver driver;
// protected String[][] locatorMap;
HashMap<String, Locator> locatorMap;
String path = "C:/Users/Young/workspace/Demo/src/com/dbyl/libarary/pageAction/UILibrary.xml";
protected Log log = new Log(this.getClass());
protected BasePage(WebDriver driver) throws Exception {
this.driver = driver;
log.debug(this.getClass().getCanonicalName());
// locatorMap = ReadExcelUtil.getLocatorMap();
locatorMap = xmlUtils.readXMLDocument(path,
this.getClass().getCanonicalName());
}
protected void type(Locator locator, String values) throws Exception {
WebElement e = findElement(driver, locator);
log.info("type value is: " + values);
e.sendKeys(values);
}
protected void click(Locator locator) throws Exception {
WebElement e = findElement(driver, locator);
log.info("click button");
e.click();
}
protected void select(Locator locator, String value) throws Exception {
WebElement e = findElement(driver, locator);
Select select = new Select(e);
try {
log.info("select by Value " + value);
select.selectByValue(value);
} catch (Exception notByValue) {
log.info("select by VisibleText " + value);
select.selectByVisibleText(value);
}
}
protected void alertConfirm() {
Alert alert = driver.switchTo().alert();
try {
alert.accept();
} catch (Exception notFindAlert) {
throw notFindAlert;
}
}
protected void alertDismiss() {
Alert alert = driver.switchTo().alert();
try {
alert.dismiss();
} catch (Exception notFindAlert) {
throw notFindAlert;
}
}
protected String getAlertText() {
Alert alert = driver.switchTo().alert();
try {
return alert.getText();
} catch (Exception notFindAlert) {
throw notFindAlert;
}
}
protected void clickAndHold(Locator locator) throws IOException {
WebElement e = findElement(driver, locator);
Actions actions = new Actions(driver);
actions.clickAndHold(e).perform();
}
public WebDriver getDriver() {
return driver;
}
public void setDriver(WebDriver driver) {
this.driver = driver;
}
public WebElement getElement(Locator locator) throws IOException {
return getElement(this.getDriver(), locator);
}
/**
* get by parameter
*
* @author Young
* @param driver
* @param locator
* @return
* @throws IOException
*/
public WebElement getElement(WebDriver driver, Locator locator)
throws IOException {
locator = getLocator(locator.getElement());
WebElement e;
switch (locator.getBy()) {
case xpath:
log.debug("find element By xpath");
e = driver.findElement(By.xpath(locator.getElement()));
break;
case id:
log.debug("find element By id");
e = driver.findElement(By.id(locator.getElement()));
break;
case name:
log.debug("find element By name");
e = driver.findElement(By.name(locator.getElement()));
break;
case cssSelector:
log.debug("find element By cssSelector");
e = driver.findElement(By.cssSelector(locator.getElement()));
break;
case className:
log.debug("find element By className");
e = driver.findElement(By.className(locator.getElement()));
break;
case tagName:
log.debug("find element By tagName");
e = driver.findElement(By.tagName(locator.getElement()));
break;
case linkText:
log.debug("find element By linkText");
e = driver.findElement(By.linkText(locator.getElement()));
break;
case partialLinkText:
log.debug("find element By partialLinkText");
e = driver.findElement(By.partialLinkText(locator.getElement()));
break;
default:
e = driver.findElement(By.id(locator.getElement()));
}
return e;
}
public boolean isElementPresent(WebDriver driver, Locator myLocator,
int timeOut) throws IOException {
final Locator locator = getLocator(myLocator.getElement());
boolean isPresent = false;
WebDriverWait wait = new WebDriverWait(driver, 60);
isPresent = wait.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver d) {
return findElement(d, locator);
}
}).isDisplayed();
return isPresent;
}
/**
* This Method for check isPresent Locator
*
* @param locator
* @param timeOut
* @return
* @throws IOException
*/
public boolean isElementPresent(Locator locator, int timeOut)
throws IOException {
return isElementPresent(driver, locator, timeOut);
}
/**
*
* @param driver
* @param locator
* @return
*/
public WebElement findElement(WebDriver driver, final Locator locator) {
WebElement element = (new WebDriverWait(driver, locator.getWaitSec()))
.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
try {
return getElement(driver, locator);
} catch (IOException e) {
// TODO Auto-generated catch block
log.error("can't find element "
+ locator.getElement());
return null;
}
}
});
return element;
}
/**
* @author Young
*
* @param locatorName
* @return
* @throws IOException
*/
public Locator getLocator(String locatorName) throws IOException {
Locator locator;
// for (int i = 0; i < locatorMap.length; i++) {
// if (locatorMap[i][0].endsWith(locatorName)) {
// return locator = new Locator(locatorMap[i][1]);
// }
// }
// return locator = new Locator(locatorName);
locator = locatorMap.get(locatorName);
if (locator == null) {
locator = new Locator(locatorName);
}
return locator;
}
}
接下來(lái)可以在pageAction使用,如果使用頁(yè)面跳轉(zhuǎn),可以使用反射機(jī)制,封裝一個(gè)PageFactory,根據(jù)傳入的Page類(lèi)class創(chuàng)建對(duì)象
PageFactory如下:
package com.dbyl.libarary.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.openqa.selenium.WebDriver;
public class PageFactory {
public synchronized static Object getPage(Class<?> key,WebDriver d)
throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
String test = key.getCanonicalName();
System.out.println(test);
Class<?> clazz = Class.forName(test);
Object obj = null;
try {
Constructor<?> constructor = clazz.getConstructor(WebDriver.class);
obj = constructor.newInstance(d);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
使用方法:
public static HomePage login(String email, String password)
throws Exception {
loginPage = new LoginPage(getDriver());
loginPage.waitForPageLoad();
loginPage.typeEmailInputBox(email);
loginPage.typePasswordInputBox(password);
loginPage.clickOnLoginButton();
Assert.assertTrue(loginPage.isPrestentProfile(), "login failed");
return (HomePage) PageFactory.getPage(HomePage.class, getDriver());
}
這樣,這個(gè)框架能夠?qū)崿F(xiàn)一些基本操作,下一步還需要實(shí)現(xiàn)失敗重試截圖,配合虛擬機(jī)
下載地址:
https://github.com/tobecrazy/Demo