在自动化测试过程当中,受网络、测试设备等诸多因素的影响,我们经常需要在自动化测试脚本中添加一些延时来更好的定位元素来进行一系列的操作。

一般有这么几种方式:

1.implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常

2.setScriptTimeout。异步脚本的超时时间。webdriver 可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。

3.pageLoadTimeout。页面加载时的超时时间。因为webdriver 会等页面加载完毕在进行后面的操作,所以如果页面在这个超时时间内没有加载完成,那么webdriver 就会抛出异常。

4.Thread.sleep()。这是一种挂起线程然后重新唤醒的方式,不建议使用,占用系统线程资源。

package com.testngDemo;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class Demo_TimeControl { public static void main(String args[])
{
WebDriver driver=new FirefoxDriver();
driver.get("http://www.baidu.com"); //设置延时操作
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);//-----页面加载时间
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//------元素等待时间(隐式等待)
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);//----脚本执行时间
//显式等待
WebElement e = (new WebDriverWait(driver, 10)) .until(
new ExpectedCondition< WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("kw"));
}
}
);
}
/**
* 自定义显式等待
* @param driver
* @param by
* @return
*/
private static WebElement webelementExplicitWait(WebDriver driver,By by)
{
return (new WebDriverWait(driver, 10)) .until(
new ExpectedCondition< WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(by);
}
}
);
}
/**
* 判断元素是否存在
* @param driver
* @param by
* @return
*/
private static boolean isPresentElement(WebDriver driver,By by)
{
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}catch(Exception e){
return false;
}
} }

我们可以根据自己的需要来封装一些元素等待,元素查找的方法,像上面判断元素是否存在,如果查找不到就抛出异常,有的时候可能是抛错没有这样的元素,有的时候也可能是抛错元素不可见等错误,可以用Excpetion来捕获。

在timeout接口里就介绍了这前三种时间等待的方法,这里也不细加研究了。

再就是显式等待ExplicitWait,可以根据我们的需要判读在一个时间范围内这个元素是否能定位到,这个作用是比较大的,像上面的方法只是来整体的延时,到底能不能来定位到元素也不知道。但是我们也可以根据自己项目需要来对这些方法进行封装,使之更好的为我们服务。

WebDriver API——延时操作及元素等待的更多相关文章

  1. Webdriver API之操作(一)

    一. 控制浏览器 1. 控制浏览器大小 driver.set_window_size(480,800) #浏览器宽480,高800显示 dirver.maximize_window() #浏览器最大化 ...

  2. Webdriver API之操作(二)

    一.窗口截图 dirver.get_screenshot_as_file("D:\\report\\image\\xxx.jpg") 二.关闭窗口 dirver.close() # ...

  3. Python+Selenium WebDriver API:浏览器及元素的常用函数及变量整理总结

    由于网页自动化要操作浏览器以及浏览器页面元素,这里笔者就将浏览器及页面元素常用的函数及变量整理总结一下,以供读者在编写网页自动化测试时查阅. from selenium import webdrive ...

  4. webdriver与JS操作浏览器元素

    1.JQuery的选择器实例 语法 描述 $(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 c ...

  5. Appium(八):Appium API(二) 元素等待、元素操作

    1. 元素等待 我们在使用脚本的时候,可能会由于网络.服务器处理.电脑等原因,我们想要找的元素没有加载出来,这个时候如果直接定位就可能会报错. 这个时候我们就可以设置元素等待了. 什么叫元素等待呢? ...

  6. Selenium常用API的使用java语言之11-设置元素等待

    WebDriver提供了两种类型的等待:显式等待和隐式等待. 1.显示等待 WebDriver提供了显式等待方法,专门针对某个元素进行等待判断. import org.openqa.selenium. ...

  7. 抛弃jQuery:DOM API之操作元素

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/dom-manipulation/ 我的Blog:http://cabbit.me/you-do ...

  8. Webdriver API之元素定位

    Webdriver提供了8种元素定位方法:id.name.class name.tag name.link text.partial link text.xpath.css selector 一.以上 ...

  9. selenium webdriver——设置元素等待

    如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...

随机推荐

  1. c实现的trim函数

    功能:去掉字符串首尾的空格,换行符等空白. 代码: #include <string.h> #include <stdio.h> #include <ctype.h> ...

  2. BZOJ1014火星人prefix Splay維護序列 + 字符串哈希

    @[Splay, 哈希] Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\), 我们将这个字符串的各个字符予以标号 ...

  3. DICOM医学图像处理:Deconstructed PACS之Orthanc

    背景: 此篇博文介绍一个开源的.基于WEB的DICOM Server软件.该开源软件完全使用C++编写,不依赖于第三方数据库(内置了SQLite数据库)或其他框架,支持RESTful API设计模式. ...

  4. .Net ToString Format [转]

    源文 :http://blog.csdn.net/luyifeiniu/article/category/25663/2 stringstr1 =string.Format("{0:N1}& ...

  5. [c++菜鸟]《Accelerate C++》读书笔记

    第0章 开始学习C++ 1.<<的行为取决于它的操作数类型,<<会把它的右操作数的字符写到左操作数所指示的流中,他是结果就是它的左操作数. 2.std::endl是一个控制器, ...

  6. PHP compact() 函数

    Compact ---- 创建一个包含变量名和它们的值的数组: <?php $firstname = "Bill"; $lastname = "Gates" ...

  7. C#中的 SET ,GET

    C#中get和SET,看来看去还是看不懂,通俗一点解释一下,用了有什么好处,不用会怎么样如果你这样写是没有什么不一样的. private int __Old; public int Old{ get{ ...

  8. 以goroutine为例看协程的相关概念

    转自  http://wangzhezhe.github.io/blog/2016/02/17/golang-scheduler/ 基本上是网上相关文章的梳理,初衷主要是想了解下golang中的gor ...

  9. Android Studio之Activity切换动画(三)

    1.上一篇文章"Android Studio之多个Activity的滑动切换(二)"中实现了多个activity之间的滑动切换,可是新切换出的activity大多是从右側进入 2. ...

  10. .net网站上传图片换电脑不显示 当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可。

    .net网站上传图片换电脑不显示 当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可.