最近工作中发现PageFactory比以前用的Page object定位元素简洁、方便。
PageFactory 的概念和Page Object应该类似,属于一种设计模式。属于Page Object的扩展,在构造函数里面调用PageFactory.initElements(driver, this);来初始化PO对象,避免WebElement过期。一旦page被PageFactory进行处理过,每一次操作的时候都会去更新其声明的WebElement使其是最新的。支持JAVA和pathoy。属于:org.openqa.selenium.support里面的。
实例:
类名:H5CarDetailPage:
//查询首页所有car list列表
@FindBy(css="div.carlist_module.noneLastBorder>div>div>div.carlist_module__body>a")
public
List<WebElement> carList;
测试类:H5CarDetailPageTest:
H5CarDetailPage h5cdp=null;
@Test(dataProvider = "test")
public void
testJ10Yuyueshijia(Map<String,String> map){
//初始化cdp
h5cdp=PageFactory.initElements(driver, H5CarDetailPage.class);
//打开H5微店首页
cpo.get(driver,
map.get("h5_site"));
//点击H5首页car list第1辆车
List<WebElement>
carlist=cpo.getElements(h5cdp.carList);
//逻辑代码
}
参考文档:
http://blog.sina.com.cn/s/blog_64693fd401018gw1.html
二、元素定位
1、selenium-webdriver中获取页面元素的方式有很多,使用注解获取页面元素是其中一种途径,
2、方式有3种:@FindBy、@FindBys、@FindAll。下文对3中类型的区别和使用场景进行介绍
1)@FindBy
@FindBy(id=
"A")
private WebElement A;
2)@FindBys
@Findbys({
@FindBy(className = "A"),
@FindBy(className = "B")})
public WebElement AB;
@FindBys相当于是取交集,是先根据第一个注解获取到对应元素,然后根据第二个注解再帅选出对应的页面元素,。如先找到符合classname=A的元素,再在这些元素集中找到classname=B的所有元素
就像如下操作:
driver.findElement(<By_FindByA>).findElement(<By_FindByB>).
3)@FindAll
@FindAll({
@FindBy(id
= "A"),
@FindBy(id
= "B")
})
public
List<WebElement> aAndB;
@FindAll相当于是取并集,如找到id=A和id=B的所有元素