selenium 超时机制

来源:互联网 发布:成都网络推广028zhiya 编辑:程序博客网 时间:2024/06/05 16:14
 Selenium是一个用于Web应用程序测试的工具。Selenium直接运行在浏览器中,就像真正的用户在操作一样。

Selenium2.0 java的一个简单示例如下:

WebDriver driver = newFirefoxDriver();           //启动firefox浏览器

driver.manage().window().maximize();              //最大化浏览器

driver.get(“http://www.sina.com.cn”);         //访问一个页面

System.out.println(driver.getPageSource());     //打印页面源码

driver.quit();                                    //退出浏览器

   get方法访问一个页面,当调用get方法时,WebDriver会一直阻塞直到该页面完全加载完成。若一个页面加载速度过慢,则会导致get方法一直阻塞,因此有时候需要对get方法设定一个超时时间,当加载超时时停止加载。设定超时的方法有两种,第一种是用selenium提供的页面加载超时方法,如:

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

try{

        driver.get("http://www.sina.com.cn");

        driver.quit();

} catch(TimeoutException e) {

        driver.quit();

}

    当超时时,任何关于driver的操作都会被阻塞,只有driver.quit()会立即关闭浏览器,销毁浏览器对应的资源。pageloadTimeout方法只适用于firefox浏览器,Chrome等其他浏览器并不适用,但我们可以自己实现一个定时器,如:

Timertimer = new Timer();

timer.schedule(new TimerTask() {

        @Override

        public void run() {

             //TODO Auto-generated method stub

           driver.quit();

        }

},1000);

driver.get("http://www.sina.com.cn");

timer.cancel();

    一些web应用程序有许多Frames或多个WindowsWebDriver支持使用“switchTo”的方法实现的窗口之间切换。以下示例展示了如何关闭除主窗口之外的其它窗口:

StringparentWindowHandle = driver.getWindowHandle();

Iterator  windowIterator =driver.getWindowHandles().iterator();

while(windowIterator.hasNext()) {

        String windowHandle = windowIterator.next();

        if (!windowHandle.equals(parentWindowHandle)) {

                driver.switchTo().window(windowHandle);

               driver.close();

        }

}

driver.switchTo().window(parentWindowHandle);

    有的Web应用程序会弹出窗口,也可以通过switchTo在主窗口和弹出窗口之间切换,如:

Alertalert = driver.switchTo().alert();

alert.accept();

    若要定位网络中的UI元素,可以通过findElementfindElements的方法,第一个方法返回一个WebElement或者抛出异常。后者返回所有WebElement的列表,或者空列表。获取和定位元素一般调用By方法,包括By IDByClass NameBy TagNameByNameBy LinkTextBy Partial LinkTextBy CSS以及ByXPATH等。例:

WebElementelement =driver.findElement(By.xpath("//input[@id=\"form_submit\"]";

   查找元素时,也可以设定超时,比较方便地方法是全局设定,如:

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

    当查找到的元素时IFrame时,则可和Windows之间可以进行切换,如:

driver.switchTo().frame(element);

   当查找到的元素可点击时(比如按钮、单选框、多选框、链接等),则可调用click方法进行点击,如:

element.click();

    一般,调用click方法,点击发生在元素的中间位置,若想点击元素的其它地方,可以调用moveToElement的方法,如:

(newActions(driver)).moveToElement(element, 20,20).click().perform();

   一些可点击的元素点击后,可能会跳到一个新的页面,通过windows的切换可获取到新页面的urltitle,如:

element.click();

StringparentWindowHandle = driver.getWindowHandle();

Iterator  windowIterator =driver.getWindowHandles().iterator();

while(windowIterator.hasNext()) {

       String windowHandle = windowIterator.next();

     if(!windowHandle.equals(parentWindowHandle)) {

           driver.switchTo().window(windowHandle);

       break;

    }

}

System.out.println(driver.getCurrentUrl());

System.out.println(driver.getTitle());

   Firefox中,页面发生切换后,立即通过getCurrentUrl获取新页面url可能会返回"about:blank",过段时间再通过getCurrentUrl时,才能返回正确的url,介于此,修改getCurrentUrl方法如下:

StringgetCurrentUrl() {

        String url = "";

        int maxRetry = 10;

        url = driver.getCurrentUrl();

        while (url.trim().equalsIgnoreCase("about:blank") &&maxRetry > 0)

        {

                  Thread.sleep(1000);

                  url = driver.getCurrentUrl();

                maxRetry--;

        }

        return url;

}

原创粉丝点击