Selenium WebDriver 之 PageObjects 模式 by Example
2015-09-01 09:31
671 查看
目录 1. 项目配置 2. 一个WebDriver简单例子 3. 使用Page Objects模式 4. 总结 5. Troubleshooting 6. 参考文档
本篇文章通过例子来阐述一下Selenium2.0 WebDriver 之 Page Objects模式。
项目配置
maven 3, pom.xml配置如下<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.46.0</version> </dependency>
另外我是用TestNG 写Selenium tests, 加如下dependency
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8</version> </dependency>
一个WebDriver简单例子
主要做如下几个动作:1. 打开博客园首页
2. 断言页面标题出现
3. 在找找看输入框输入字符
4. 点击找找看按钮
5. 断言进入的页面标题
package test.demo; import static org.testng.Assert.assertEquals; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxProfile; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; ; /** * @Description: A simple Test using WebDriver * @author wadexu * * @updateUser * @updateDate */ public class WebPageTest { private WebDriver driver; @BeforeTest public void setUp() { FirefoxProfile firefoxProfile = new FirefoxProfile(); // use proxy firefoxProfile.setPreference("network.proxy.type", 1); firefoxProfile.setPreference("network.proxy.http", "10.51.1.140"); firefoxProfile.setPreference("network.proxy.http_port", "8080"); driver = new FirefoxDriver(firefoxProfile); } @AfterTest public void tearDown() { driver.close(); } @Test public void test() { driver.get("http://www.cnblogs.com/"); assertEquals("博客园 - 开发者的网上家园", driver.getTitle()); WebElement searchBox = driver.findElement(By.id("zzk_q")); searchBox.sendKeys("wadexu"); WebElement searchBtn = driver.findElement(By.xpath("//*[@id='search_block']/div[1]/input[2]")); searchBtn.click(); assertEquals("wadexu-博客园找找看", driver.getTitle()); } }
这种写法缺点很多, 可读性差,页面元素,操作HTML,测试逻辑全部在一起。
##转载注明出处:/article/6992246.html
使用Page Objects模式
PageObjects是对具体页面的抽象,使用时通过PageFactory来构造。首先我们为博客园首页和找找看搜索页面定义两个page objects
-- CnBlogsHomePage
package test.demo; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; /** * @Description: 博客园首页 * @author wadexu * * @updateUser * @updateDate */ public class CnBlogsHomePage { @FindBy(id = "zzk_q") //找找看输入框 protected WebElement searchBox; @FindBy(xpath = "//*[@id='search_block']/div[1]/input[2]") //找找看按钮 protected WebElement searchBtn; public void searchFor(String content) { searchBox.sendKeys(content); searchBtn.click(); } }
-- SearchResultPage
package test.demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; /** * @Description: 博客园找找看頁面 * @author wadexu * * @updateUser * @updateDate */ public class SearchResultPage { @FindBy(id = "searchResult") protected WebElement searchResult; //for tutorial purpose only public boolean searchResultListNotNull() { WebElement searchResultItems = searchResult.findElement(By.cssSelector(".forflow")); List<WebElement> resultItemTitleList = searchResultItems.findElements(By.tagName("a")); for (WebElement e : resultItemTitleList) { System.out.println(e.getText()); } return resultItemTitleList.size() > 0; } }
##转载注明出处:/article/6992246.html
下面是使用Page Objects 的测试
package test.demo; import static org.testng.Assert.assertTrue; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.support.PageFactory; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; /** * @Description: UsingPageObjectsTest * @author wadexu * * @updateUser * @updateDate */ public class UsingPageObjectsTest { private WebDriver driver; @BeforeTest public void setUp() { FirefoxProfile firefoxProfile = new FirefoxProfile(); // use proxy firefoxProfile.setPreference("network.proxy.type", 1); firefoxProfile.setPreference("network.proxy.http", "10.51.1.140"); firefoxProfile.setPreference("network.proxy.http_port", "8080"); driver = new FirefoxDriver(firefoxProfile); } @AfterTest public void tearDown() { driver.close(); } @Test public void test() { driver.get("http://www.cnblogs.com/"); CnBlogsHomePage homePage = PageFactory.initElements(driver, CnBlogsHomePage.class); homePage.searchFor("wadexu"); SearchResultPage resultPage = PageFactory.initElements(driver, SearchResultPage.class); assertTrue(resultPage.searchResultListNotNull()); } }
WebDriver为了支持PageObject模式,支持库包含一个叫PageFactory的工厂类, 我们通过PageFactory的initElements方法来实例化PageObject的实例.
这种方式看上去简洁明了,可读性高,封装了界面交互细节,可以使测试更关注业务逻辑而非页面细节,就像在写功能测试用例。
Run as TestNG 测试结果如下
就是这么简单!使用Rest-assured 测试Restful Web Services WadeXu 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script WadeXu Postman (Chrome插件) HackerVirus VC/MFC如何设置对话框背景颜色 youxin 玩转单元测试之DBUnit WadeXu 性能分析神器VisualVM WadeXu 性能分析神器VisualVM qingchen1984 玩转单元测试之WireMock -- Web服务模拟器 WadeXu 写在离职前夕 平静缓和用胸音说爱 带你入门带你飞Ⅰ 使用Mocha + Chai + Sinon单元测试Node.js WadeXu PASSED: test =============================================== Default test Tests run: 1, Failures: 0, Skips: 0 =============================================== [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@288051: 4 ms [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@4d865b28: 28 ms [TestNG] Time taken by org.testng.reporters.XMLReporter@45d64c37: 6 ms [TestNG] Time taken by [TestListenerAdapter] Passed:0 Failed:0 Skipped:0]: 0 ms [TestNG] Time taken by org.testng.reporters.EmailableReporter@68e6ff0d: 3 ms
##转载注明出处:/article/6992246.html
运行的很慢, 主要是因为博客园的页面加载的许多Script 都是在线引入,很多这种source <script async="" type="text/javascript" src="http://www.googletagservices.com/tag/js/gpt.js"></script>
而我又不能禁用script,否则点不了找找看button。
测试截图
总结
本文我们学到的知识点有:使用Selenium WebDriver查找元素,通过By id, xpath, cssSelector, tagName 例子里尽可能的运用了这些方式。
通过FirefoxProfile 设置代理, 也可以设置页面不加载一些对象如image, script, stylesheet 设置方式:firefoxProfile.setPreference("permissions.default.image", 2); //2表示关闭
Page Objects模式, 优点很多,分离页面元素及操作元素的步骤,便于维护, 降低代码冗余度,提升复用率。
(此图来源于网络)
##转载注明出处:/article/6992246.html
Troubleshooting
1. org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 msfirefox浏览器版本太高,selenium不兼容,要么降低firefox的版本,要么用新的selenium webDriver
2. Selenium WebDriver正常打开浏览器,但是无法访问页面
跟环境有关,使用FirefoxProfile setPreference 设置个代理, 有几种方式供参考。
WebDriver每次启动一个Firefox的实例时,会生成一个匿名的profile,并不会使用当前Firefox的profile。这点一定要注意。比如如果访问被测试的web服务需要通过代理,你想直接设置Firefox的代理是行不通的,因为WebDriver启动的Firefox实例并不会使用你这个profile,正确的做法是通过FirefoxProfile来设置。
3. org.openqa.selenium.NoSuchElementException: Unable to locate element
代码问题,不能定位元素
参考文档
SeleniumHQ WebsiteSelenium API JavaDocs
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以点击右下方的推荐按钮,您的鼓励是我创作的动力。
##转载注明出处:/article/6992246.html
相关文章推荐
- Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】
- Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】
- Objective-C 【@property 的参数问题】
- Objective-C 【@property 的参数问题】
- OC随机数方法
- [objective-c]_[performSelector的使用]
- objective-C编程 面向对象的编程基本概念
- [Objective-c]_[NSString的基本使用]
- OC中如何进行多文件开发?
- IOS之Objective-C学习笔记(六)
- 斯坦福大学iOS应用开发教程学习笔记(第三课) Objective-C
- NSMutableString可变字符串的定义及常用方法
- 关于JSONArray明明添加add JSONObject却为空
- OC基础-零基础学习Objective-C:第四部分.NSArray
- OC基础-零基础学习Objective-C:第五部分.@property
- OC基础-零基础学习Objective-C:第六部分.ARC内存管理
- objective-c 实现常用算法(冒泡、选择、快速、插入)
- Swift Tutorial(swift 教程) 3:Arrays, Objects, and Classes数组,对象和类
- gobject base class
- iOS开发系列—Objective-C之内存管理(前辈写的,借鉴了一下,超赞)