很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了。其中的原因估计60%的人都知道,是因为元素加载这块有问题。通常的解决方案就是加上sleep或者隐式等待(implicitly_wait),后面发现这种办法太浪费时间了,测试用例一旦过多就要抓狂了,并且还是不太稳定。

    其实,要想提升selenium脚本的稳定性和速度,显式等待结合EC(expected_conditions)模块是个非常不错的选择,下面是python语言的写法(人生苦短,我用python),大家可以进行二次封装。

  1. #!/usr/bin/python3# -*- coding: utf-8 -*-# @创建时间: 2018/10/16 09:01# @创建人 : Kevin# @IDE : PyCharmfrom selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC
  1. driver = webdriver.Chrome()driver.get('url')
  2. """  driver不用多说  10表示最大的超时时间(s) 0.1表示查询元素的频率"""
  1. '''判断title是否是一致,返回布尔值'''WebDriverWait(driver,10,0.1).until(EC.title_is("title_text"))
  2.  
  3. '''判断title是否与包含预期值,返回布尔值'''WebDriverWait(driver,10,0.1).until(EC.title_contains("title_text"))
  4.  
  5. '''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回元素'''WebDriverWait(driver,10,0.1).until(EC.presence_of_element_located((locator)))
  6.  
  7. '''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''WebDriverWait(driver,10,0.1).until(EC.visibility_of_element_located((locator)))
  8.  
  9. '''判断元素是否可见,如果可见就返回这个元素'''WebDriverWait(driver,10,0.1).until(EC.visibility_of(driver.find_element(locator)))
  10.  
  11. '''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''WebDriverWait(driver,10,0.1).until(EC.presence_of_all_elements_located((locator)))
  12.  
  13. '''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''WebDriverWait(driver,10,0.1).until(EC.visibility_of_any_elements_located((locator)))
  14.  
  15. '''判断指定的元素中是否包含了预期的字符串,返回布尔值'''WebDriverWait(driver,10,0.1).until(EC.text_to_be_present_in_element((locator),'预期的text'))
  16.  
  17. '''判断指定元素的value属性值中是否包含了预期的字符串,返回布尔值(注意:只是value属性)'''WebDriverWait(driver,10,0.1).until(EC.text_to_be_present_in_element_value((locator),'预期的text'))
  18.  
  19. '''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''WebDriverWait(driver,10,0.1).until(EC.frame_to_be_available_and_switch_to_it(locator))
  20.  
  21. '''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''WebDriverWait(driver,10,0.1).until(EC.invisibility_of_element_located((locator)))
  22.  
  23. '''判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False'''WebDriverWait(driver,10,0.1).until(EC.element_to_be_clickable((locator)))
  24.  
  25. '''等待某个元素从dom树中移除'''WebDriverWait(driver,10,0.1).until(EC.staleness_of(driver.find_element(locator)))
  26.  
  27. '''判断某个元素是否被选中了,一般用在下拉列表'''WebDriverWait(driver,10,0.1).until(EC.element_to_be_selected(driver.find_element(locator)))
  28.  
  29. '''判断某个元素的选中状态是否符合预期'''WebDriverWait(driver,10,0.1).until(EC.element_selection_state_to_be(driver.find_element(locator),True))
  30.  
  31. '''判断某个元素的选中状态是否符合预期'''WebDriverWait(driver,10,0.1).until(EC.element_located_selection_state_to_be((locator),True))
  32.  
  33. '''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''accept = WebDriverWait(driver,10,0.1).until(EC.alert_is_present())

selenium自动化之显式等待和EC(expected_conditions)模块的更多相关文章

  1. selenium 找不到元素 (显式等待 和隐式等待的区别)

    selenium自动化页面元素不存在异常发生的原因有一下几点: (1)页面加载时间过慢,需要查找的元素程序已经完成但是页面还未加载成功.此时可以加载页面等待时间. (2)查到的元素没有在当前的ifra ...

  2. selenium—隐式等待和显式等待

    一.隐式等待和显式等待的区别 隐式等待:是整个页面的等待.设置一个最长的等待时间,在规定时间内整个页面加载完成,则执行下一步,否则继续等待直到最长等待时间结束. 显式等待:是针对某个元素的等待.在设置 ...

  3. Selenium系列(六) - 强制等待、隐式等待、显式等待

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  4. selenium(5)-解读强制等待,隐式等待,显式等待的区别

    背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...

  5. selenium 隐式等待与显式等待

    1.隐式等待:driver.implicitly_wait() driver = webdriver.Chrome()driver.implicitly_wait(10)     #获取元素时最多会等 ...

  6. python+selenium 自动化测试——显式等待详解

    1.前言 之前有提到过等待函数,等待函数分为:强制等待(sleep).隐式等待(implicitly_wait),显示等待(WebDriverWait),这次以显示等待方式专门做一次总结,因为我个人是 ...

  7. Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  8. 基于Selenium2+Java的UI自动化(8)- 显式等待和隐式等待

    一.隐式等待 package com.automation.waits; import java.util.concurrent.TimeUnit; import org.openqa.seleniu ...

  9. selenium测试(Java)-- 显式等待(九)

    转自:https://www.cnblogs.com/moonpool/p/5668571.html 显式等待可以使用selenium预置的判断方法,也可以使用自定义的方法. package com. ...

随机推荐

  1. Linux关于scp命令

    声明:本文主要转自https://www.2cto.com/os/201503/379474.html scp主要应用场景如下: (1)必要时,每个季度或者每月将数据由这台服务器传输到另外一台,不过前 ...

  2. 使用QT开发GoogleMap瓦片显示和下载工具

    之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背景图或者 ...

  3. HTML&CSS 问题

    1.子div使用浮动,父div高度自适应(个人感觉好用) 方法: css: <style> .clear{ clear:both} </style> html:在父div关闭之 ...

  4. ubuntu—终端安装mysql

    ---恢复内容开始--- Step 1 : 安装指令 ~$ sudo apt-get install mysql-server Step 2: 查看是否正常安装 ~$ ps aux | grep my ...

  5. mysql启动错误处理

    1.当启动MySQL时,报如下错误 [ERROR] Plugin 'InnoDB' init function returned error.[ERROR] Plugin 'InnoDB' regis ...

  6. Archlinux下安装微信小程序开发工具

    由于微信小程序没有Linux版本,所以需要用wine来跑 一.安装wine sudo pacman -S wine 二.安装nwjs-sdk 微信开发工具包基于nwjs-sdk #没有wget就先安装 ...

  7. react-router-dom实现全局路由登陆拦截

    相比与vue的路由集中式管理,能够很好的进行统一的路由操作,react的路由看起来更乱,想要进行像vue的全局路由管理不是那么得心应手.在我们的项目中,有很多页面是需要登陆权限验证的,最好的方式就是能 ...

  8. spring-集成redis

    Redis是key-value存储的非关系型数据库.Spring Data Redis包含了多个模板实现,用来完成Redis数据库的数据存取功能 1.如何连接Redis? Spring Data Re ...

  9. collections.Counter类统计列表元素出现次数

    # 使用collections.Counter类统计列表元素出现次数 from collections import Counter names = ["Stanley", &qu ...

  10. 【laravel】passport的scope作用域

    1.根据作用域生成token $user->createToken($request->name,['test1'])->accessToken; 2.注册中间件 'scopes' ...