首页 > 代码库 > selenium测试框架(java) 版本演化一
selenium测试框架(java) 版本演化一
selenium的自动化测试代码应该如何组织? 如链接:https://code.google.com/p/selenium/wiki/PageObjects 这里提供了一种PageObject的设计思想,并且在百度内部给出了一个感觉比较实用的实现。其组织结构思想如下:
Page 封装页面元素,以及页面应提供的服务。 尽量隐藏页面的细节,不要暴露出来。widget 封装Page中的通用的组件。 这里的理念是所有的WebElement都是控件。 通用的页面样式,如导航栏,列表,组合查询框,可以封装成一个大控件。Data 封装测试数据。Test 封装测试驱动代码。推荐使用testng。
本文意图重新搭建一个简化的测试框架。
第一个版本,建立起可测的Selenium项目。 包含一个page基类,一个继承的实际待测页面BaiduMainPage,一个驱动的测试用例BaiduMainPageTest。
下面的需要改进点: 1,BaiduMainPageTest中使用的driver是在test中明确的声明为FireFox。应该用配置的方式来实现选用任意一个Driver。并且这里需要实现一个基类来完成这些事情。
2,可以将初始化元素,并将打开页面的过程封装成一个导航类。另外,经常会发生NoSuchElementException。添加等待后,基本解决。但是需要排查出现的原因,怀疑是没有及时加载。
框架代码
项目使用maven管理:
<dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.41.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8.8</version> </dependency>
BasePage
/** * <p>The <b>Page Object</b> pattern represents the screens of your web app as a series of * objects.</p> * * <p>PageObjects can be thought of as facing in two directions simultaneously. * Facing towards the developer of a test, they represent the services offered * by a particular page. Facing away from the developer, they should be the only * thing that has a deep knowledge of the structure of the HTML of a page (or * part of a page) It‘s simplest to think of the methods on a Page Object as * offering the "services" that a page offers rather than exposing the details * and mechanics of the page.</p> * * @see <a href="http://code.google.com/p/webdriver/wiki/PageObjects">Page Objects Wiki</a> * * @author lizejun */public abstract class Page implements SearchContext{ protected Logger logger = LoggerFactory.getLogger(getClass()); protected WebDriver driver = null; public Page(WebDriver driver) { if (null == driver) { throw new IllegalArgumentException("WebDriver cannot be null."); } this.driver = driver; } public WebDriver getWebDriver() { return driver; } /** * 获得当前的地址 * @return */ public String getCurrentUrl() { return driver.getCurrentUrl(); } /** * 获取某个元素 */ public WebElement findElement(By by) { return driver.findElement(by); } /** * 获取符合 */ public List<WebElement> findElements(By by) { return driver.findElements(by); } /** * 用于硬性的等待 * @param seconds */ public void sleep(int seconds) { try { TimeUnit.SECONDS.sleep(seconds); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 用于等待某个元素出现,软等待 * @param by */ public boolean wait(final By by){ new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver arg0) { return arg0.findElement(by).isDisplayed(); } }); return true; } /** * 处理页面上弹出的Alert() * @param option */ public Alert getAlert(){ sleep(2); Alert alert = driver.switchTo().alert(); return alert; } /** * 模拟键盘箭头向下,然后回车。即,模拟下拉选中 */ public void KeyDownAndEnter(){ sleep(1); Actions actions = new Actions(driver); actions.sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform(); } /** * 模拟键盘回车 */ public void KeyEnter(){ sleep(1); Actions actions = new Actions(driver); actions.sendKeys(Keys.ENTER).build().perform(); } /** * 关闭当前页面,并将焦点放到打开的新页面 */ public void switchToNewPage(){ sleep(1); String handleNew=""; for (String handle : driver.getWindowHandles()) { handleNew=handle; } driver.close(); sleep(1); driver.switchTo().window(handleNew); }}
DemoPage
public class BaiduMainPage extends Page{ public BaiduMainPage(WebDriver driver) { super(driver); } /** * 输入文本input */ @FindBy(how=How.ID,using="kw1") WebElement inputbox; /** * 查询按钮 */ @FindBy(how=How.ID, using="su1") WebElement submitbox; /** * 新闻链接 */ @FindBy(name="tj_news") WebElement newsIndex; /** * 输入待搜素文本 * @param text */ public void SearchText(String text) { inputbox.sendKeys(text); submitbox.click(); } public void clickNewsIndex() { newsIndex.click(); }}
TestCase with testng
public class BaiduMainPageTest{ protected WebDriver driver = null; protected BaiduMainPage page = null; @BeforeClass public void init() { driver = new FirefoxDriver(); } @BeforeMethod public void initPage() { String path = "http://www.baidu.com/"; driver.get(path); page = new BaiduMainPage(driver); PageFactory.initElements(driver, page); } @Test public void testSearch(){ String text="apple"; page.SearchText(text); Assert.assertTrue(driver.getTitle().contains(text)); System.out.println(page.getCurrentUrl()); } @Test public void testnews(){ page.clickNewsIndex(); page.sleep(2); System.out.println(page.getCurrentUrl()); Assert.assertTrue(page.getCurrentUrl().contains("news.baidu.com")); } @AfterClass public void quit() { driver.quit(); }}
selenium测试框架(java) 版本演化一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。