Selenium 脚本、页面操作和页面元素分离的写法
1. 每个脚本分为三部分: test ( 即是test case), flow (即操作页面的工作流), page ( 页面元素)。 test 里的 step (验证点) 都是一个方法,但该方法不在 test具体实现, 具体实现是在 flow 里完成的;而 flow 是实现操作的具体工作流,但flow 操作的页面元素不在 flow 定义, 页面元素在 page 里定义。 工作链为: test -> flow -> page。 每个脚本的第一步即 在 Test, Flow 和 Page 各建立一个 class, 如 xxTest.java, xxFlow.java, xxPage.java.
2. 继承:
xxTest extends yyAbstractTest ( Mercury 的工程继承 MercuryAbstractTest, RP工程继承RPAbstractTest)
xxFlow extends yyAbstractFlow ( Mercury 的工程继承 MercuryAbstractFlow, RP工程继承RPAbstractFlow )
xxPage extend AbstractPage
3. 初始化(构造函数);
xxPage: public xxPage ( WebDriver driver ){
super ( driver);
}
xxFlow: 在定义构造函数之前先定义两个私有变量(其中一个是引进 xxPage):
private WebDriver driver = null;
private xxPage xxpage = null;
public xxFlow (WebDriver driver){
this.driver = driver;
this.xxpage = new xxPage (driver)
}
4. 引入上一层的java 文件(构建上一层类的实例):
xxTest : 引入 xxFlow 并要 new 一个 xxFlow 实例
xxFlow: 引入xxPage 并 在 构造函数 new 一个 xxPage 实例
这是因为 Test 要用到 Flow 实例去进行操作;而Flow 要用到Page实例去引用Page类定义的元素 (由于 Flow 不是main 类或不是TestNG 的 test 类, 所以不能直接 xxPage xxpage = new xxPage(driver); 而只能把 xxPage xxpage 声明为自己的私有变量,最后在构造函数里实例化).
5. xxTest 和 xxFlow 开头都是 定义 logger : private static final Logger logger = Logger.getLogger(xx.class);
具体: xxTest extends yyAbstractTest {
private static final Logger logger = Logger.getLogger(xxTest.class);
}
xxFlow extends yyAbstractFlow {
private static final Logger logger = Logger.getLogger(xxFlow.class);
}