java + selenium测试框架(之等待机制) 版本演化二

使用selenium-ide录制,以及直接用selenium-java.jar写测试用例,你会发现它的执行速度很快。大大超过了手工操作的速度,甚至可能也超过了浏览器加载的速度(比浏览器都快?结果就是找不到元素)。

如果页面上确实有某个元素,但是在测试时提示NoSuchElementException,那原因有两个:1,你抓取元素的策略错了;2,执行时元素还没加载出来。

在调用了driver.get(url)之后,为了保证元素能够取到正确初始化,需要增加一个等待加载完成的函数,保证页面完成加载。

抛出第一个问题 如何确认页面加载完成?

如何确认页面加载完成?

在selenium中,提供了一个class WaitForPageToLoad,WaitForPageToLoad中的等待机制,提供了两种方法:一是使用js执行document[‘readyState‘];。如果不支持该方法,则使用第二种方法,如果在1s中,页面的长度没有发生变化,则认为已经加载完了。

如果在等待一个设定的超长时间没有完成,则终止。

页面加载时调用waitforpagetoload

WebDriver中并没有提供该函数,它被封装在selenium中。为了在使用WebDriver的程序中,能够使用selenium RC的功能,需要引入向前兼容的WebDriverBackedSelenium。

public class BaiduMainPageWaitTest{

    protected WebDriver driver = null;

    protected Selenium  selenium = null;

    protected BaiduMainPage page = null;

    @BeforeClass
    public void init() {
        System.setProperty("webdriver.ie.driver","lib\\IEDriverServer.exe");

        DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
        ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);

        /**
         * <b>WebDriverBackedSelenium </b>
         * Allows for WebDriver and Selenium to live side-by-side.<br/>
         * Provides a simple mechanism for a managed migration from the
         * existing Selenium API to WebDriver‘s.<br/>
         * Does not require the standalone Selenium RC server to be run.<br/>
         */
        driver = new InternetExplorerDriver(ieCapabilities);
    }

    @BeforeMethod
    public void initPage() {
        String path = "http://www.baidu.com/";
        page = new BaiduMainPage(driver);

        selenium = new WebDriverBackedSelenium(driver,path);

    //  selenium.open(path);
        driver.get(path);

        selenium.waitForPageToLoad("5000");

        PageFactory.initElements(driver, page);
    }

    /**
     * After creating a WebDriverBackedSelenium instance with a given Driver,
     * one does not have to call start() - as the creation of the Driver already started the session.
     * At the end of the test, stop() should be called instead of the Driver‘s quit() method.
     *
     * @see <a href="https://code.google.com/p/selenium/wiki/SeleniumEmulation">Selenium Emulation  Wiki</a>
     */
    @AfterClass
    public void quit() {
        try{
            selenium.stop();
            if(driver != null)
                driver.quit();
        }   finally {
            driver = null;
        }
    }
}

对异步加载的元素增加等待机制

//如下这段摘自网上
在Selenium中,提交会引起页面加载的情况下,需要调用waitforpagetoload。   

但是在我们的测试中,我发现就算waitforpagetoload成功返回后,也不意味着页面所有元素加载
成功。如果此时针对某一个元素进行断言/操作,就会失败。   

原来Selenium中的waitforpagetoload方法成功返回后,并未包括页面onload部分的
javascript。这就造成测试脚本概率性失败,并且调试十分困难。

因为页面可能有延迟加载的情况。虽然页面已经渲染完毕,但是可能有AJX延迟加载。有些元素需要等AJAX调用完成后才能显示。这时就需要在页面上增加一个等待机制了。

/**
 * 用于等待某个元素出现,软等待
 * @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;
}

比如说,你想找某个id="name"的元素:

if (wait(By.id("name")))
     xxx;
else
    throw new ElementNotFoundException("xxx not found");

终极大招 硬等待

方案一:

driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.SECONDS);

方案二:

public static void sleep(int seconds) {
    try {
        TimeUnit.SECONDS.sleep(seconds);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
时间: 2024-11-08 00:45:58

java + selenium测试框架(之等待机制) 版本演化二的相关文章

selenium测试框架(java) 版本演化一

selenium的自动化测试代码应该如何组织?  如链接:https://code.google.com/p/selenium/wiki/PageObjects  这里提供了一种PageObject的设计思想,并且在百度内部给出了一个感觉比较实用的实现.其组织结构思想如下: Page 封装页面元素,以及页面应提供的服务. 尽量隐藏页面的细节,不要暴露出来. widget 封装Page中的通用的组件. 这里的理念是所有的WebElement都是控件. 通用的页面样式,如导航栏,列表,组合查询框,可

selenium测试框架使用xml作为对象库

之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locator对象 不能够实现Locator对象重名 文件比较大,读写速度没有xml快 所以,重新写了使用dom4j操作xml,使用xml管理Locator对象,能够有效解决以上问题 首先,定义Locator文件 <?xml version="1.0" encoding="UTF-8&

Java Junit测试框架

Java    Junit测试框架 1.相关概念 ? JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要用于白盒测试,回归测试. ? 白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人 员是公开的. ? 回归测试:软件或环境的修复或更正后的再测试,自动测试工具对这类测试尤其有用. ? 单元测试:最小粒度的测试,以测试某个功能或代码块.一般由程序员来做,因为它需要知道内部程序设

selenium 测试框架中使用grid

之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecrazy/p/4529399.html 在测试框架中使用Log4J 2 :http://www.cnblogs.com/tobecrazy/p/4557592.html 首先介绍一下grid ,selenium grid 是一种执行测试用例时使用的包含不同平台(windows.Linux.Androi

selenium测试框架篇,页面对象和元素对象的管理

前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对

selenium测试框架篇

做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对象),一个输入密码的密码框 一个登陆框.当然,zhihu不止一个页面,有无数页面,每一个页面都可以封装为一个对象.而每个 页面的元素,也可

java+selenium+new——显式等待和自定义显式等待

原文地址:https://www.cnblogs.com/xiaobaibailongma/p/12292780.html

开发者常用的10大GUI测试框架

1.Abbot - Java GUI 测试框架 Abbot是一个基于GUI的简单的Java测试框架,它能够帮助开发者测试Java用户界面. 它提供事件自动生成和验证Java GUI组件,使您能够轻松地启动,探索和控制应用程序.开发者可通过脚本和编译代码两种方式来使用Abbot框架,这就是为什么它被认为是在开发者的系统测试和QA的功能测试中都能用到的最完美的GUI测试工具. 2.EggPlant - GUI自动化测试工具 EggPlant是一个QA的GUI自动化测试工具,它是为使专业商业软件的应用

Selenium关键字驱动测试框架Demo(Java版)

Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html Selenium关键字驱动测试框架Demo(Java版),布布扣,bubuko.com