前言

在使用python selenium进行自动化测试实践的过程中,经常会遇到元素定位不到,弹出框定位不到等等各种定位不到的情况,在大多数的情况下,无非是以下两种情况:

1、有frame存在,定位前,未switch到对应的frame内

2、元素未加载完毕(从界面看已经显示),但DOM树还在load状态或在加载js

那对于这类情况,怎么解决呢?

通俗的讲法: 等待。

高大上点:解决自动化测试代码与浏览器加载渲染之间的同步问题。

下面我们分段讲述各种处理方式:

一 强制等待

这种方式简单粗暴直接有效,不足的地方就是不够灵活。下面看下代码片段:

#_*_ coding:utf-8 _*_

__author__ = '苦叶子'

from selenium import webdriver

from time import sleep   # 注意

if __name__ == '__main__':

driver = webdrivrer.Firefox()

driver.get('http://www.testingunion.com')

sleep(3)    # 强制等待3s在执行下一步

print u"当前url:  ", driver.current

sleep(3)   #强制等待3s在执行下一步

driver.quit()

注: 请注意加粗有删除线的代码行,用于实现强制等待

二、隐性等待

webdriver提供了基础的同步方法,隐性等待implicitly_wait(xx),该方式的意义是:不论业务代码运行在那一步,都需要等待webdriver  xx秒,如果在等待的xx秒内 webdriver完成了对应的动作,则业务代码和webdriver都正常继续执行;如果超过了xx秒,webdriver还未完成对应的动作,则业务代码继续执行,而webdriver则会抛出异常(例如timeout或元素未找到等等异常),请看代码实现片段:

#_*_ coding:utf-8 _*_

__author__ = '苦叶子'

from selenium import webdriver

if __name__ == '__main__':

driver = webdrivrer.Firefox()

driver.implicitly_wait(30)   # 隐性等待,最长等30s

driver.get('http://www.testingunion.com')

print u"当前url: ", driver.current_url

driver.quit()

注:上述代码中加粗删除线的代码通过调用webdriver提供的标准隐性等待方式来实现一种同步机制。其设置的是一个最长等待时间,如果在规定的时间未完成,则进入下一步。

不足:在实践中,通常我们需要操作的元素已经显示出来,但因网络或其他因素,浏览器一直处于加载个别js或图片或其他资源时,隐性等待模式下,这时会依旧处于等待状态直至页面全部加载完毕才能进入下一步。那有没有更好的办法呢?当然是有的,请参见下一方式。

重要:隐性等待是全局性质的,只需在driver实例化后,设置一次即可。

在实践中,经常见到新手把隐性等待当做sleep来使用,在每个步骤后都用一次。

三、显性等待

更为强大的方式是显性等待来实现同步机制,需要WebDriverWait类,辅以until()或until_not()方法,根据判断条件进行灵活的同步,它的主要机制是:程序在规定的时间内每个xx秒看一下判断条件是否成立,如果成立则执行下一步,否则继续等待,直至超过设置的最长时间,然后抛出异常。请看具体的代码片段:

#_*_ coding:utf-8 _*_

__author__ = '苦叶子'

from selenium import webdriver

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

if __name__ == '__main__':

driver = webdrivrer.Firefox()

# 隐性等待和显性等待可以同时用,要注意的是:最大等待时间取决两者之间的大值

driver.implicitly_wait(10)

driver.get('http://www.testingunion.com')

locator = (By.LINK_TEXT,  u'webdriver')

try:

# 在最长20s内,每个0.5秒去检查locator是否存在,如果存在则进入下一步

WebDriverWait(driver, 20, 0.5).until(EC.presence_of_located(locator))

# 提取该文本对应的url,并打印出来

print driver.find_element_by_link_text(u'webdriver').get_attribute('href')

finally:

print u"异常了"

driver.quit()

在本示例中,我们设置了隐性等待和显性等待,在其他的操作中隐性等待起决定性作用,在示例中的WebDriverWait设置了显性等待的地方,则显性等待起决定性作用,但要注意的是:最长等待时间取决于两者之间的大值,所以这里显性等待的最长时间为20s。

在这里我们主要用到了WebDriverWait类和expected_conditions模块,让我们近距离的接触下它们。

WebDriverWait类

定义实现在wait模块中,实现了webdriver的显性等待机制,先看下它有哪些参数和方法:

selenium.webdriver.support.wait.WebDriverWait(类)

__init__(self,

driver,  # 传入实例化的webdriver对象

timeout,  # 超时时间,等待的最大时间(需考虑同时考虑隐性等待时间)

poll_frequency=POLL_FREQUENCY,  # 调用until或until_not方法的间隔时间,上例为0.5s

ignored_exceptions=None  #指定忽略的异常,如果指定了要忽略的异常类型,则在调用until或until_not过程中,捕获该类异常时不中断代码,继续等待。默认只有NoSuchElementException

)

until(self,

method,    # 在等待期间,每个一段时间调用这个传入的方法,直到返回值为false

message='' # 如果超时,则抛出TimeoutException,将message传入给异常

)

until_not 与until相反,until是当某个元素满足某种条件时(出现、存在等等)继续执行;until_not则是当某个元素不满足某种条件时继续执行,参数含义相同

特别注意:

很多时候大家在使用until或until_not时,会将一个WebElement对象传入给method,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))     # 这是错误的用法

这里的参数一定要是可调用的,这个对象一定要有__call__()方法,否则会抛出异常:

TypeError: 'xxx' object is not callable

在这里,也可以用selenium2提供的expected_conditions模块中提供的各种条件,也可用WebElement中的is_displayed(),is_selected(),is_enabled()方法或是自己封装的方法均可。下面我们再看看selenium提供了哪些条件,如图所示:

结束语

本文就python selenium三种同步解决方式进行了较为详细的说明,这是使用selenium进行自动化测试实践的必备技能,希望对大家有所帮助。

python time智能等待_Python Selenium智能等待相关推荐

  1. python批量检索文献_Python+Selenium,让浏览器自动帮你下文献

    在做学术.搞科研的过程中,我们往往需要针对一个特定的主题下载海量的文献.在把几百篇文献下载到电脑的过程中,假如遇到不够友好的数据库不提供批量下载的功能,怎么办?我恰好遇到了这样的批量下载的科研任务和批 ...

  2. python语音控制智能家电_Python 树莓派智能音箱语音控制电脑开关机-Python 实用宝典...

    完成下面这个有趣的实验,你所需要的东西有: 1.路由器(能够形成局域网,且电脑已用网线连接) 2.一个智能音箱(本教程使用的是亚马逊 Echo Dot 2) 3.主板支持wake on lan (大部 ...

  3. python控制电脑关机_Python利用智能音箱语音控制电脑开关机

    完成下面这个有趣的实验,你所需要的东西有:1.路由器(能够形成局域网,且电脑已用网线连接) 2.一个智能音箱(本教程使用的是亚马逊 Echo Dot 2) 3.主板支持wake on lan (大部分 ...

  4. 基于python的智能小车_Python开发智能移动小车平台上位机

    智能移动小车平台上位机界面设计告一段落,特此记录一下整体的框架,以免之后再用的时候回忆不起来. 一.地图获取路径数据: 1.首先通过奥维地图绘制从起点到终点的多条路径,然后根据最优路径选择算法(此处选 ...

  5. python语音播报天气预报_python实现智能语音天气预报

    python编写的语音天气预报 本系统主要包括四个函数: 1.获取天气数据 1.输入要查询天气的城市 2.利用urllib模块向中华万年历天气api接口请求天气数据 3.利用gzip解压获取到的数据, ...

  6. python自动化控制运动_Python +selenium自动化帮你预订运动场地

    导语 炎热的夏天,正是换上短裤短裙晒身材的时候.但是,身材不好怎么办?运动是一个选择,特别是像我们程序员行业,天天坐在空调办公室,更应该出出汗,正所谓:冬练三九,夏练三伏. 下班后,约上公司的妹子,打 ...

  7. python音标1003python音标_python selenium 爬取百度翻译单词音标

    python selenium 小爬虫 主要流程 读取excel文件中的单词--利用selenium 去百度翻译中获取单词对应的音标--写入cvs文件 selenium 安装 环境配置略过 谷歌浏览器 ...

  8. python自动投递简历_python selenium 实现简历自动刷新

    1 安装Python 和 selenium (1)下载Python 官网地址: https://www.python.org/ftp/python/3.6.8/python-3.6.8-amd64.e ...

  9. python自动化验证部署_Python selenium自动化测试环境安装部署

    1. Windows系统下python环境搭建 1.1首先访问http://www.python.org/download/去下载最新的python版本.本人使用的是2.7的python版本 1.2安 ...

最新文章

  1. 多维数组(冒泡排序,稀疏数组)
  2. abaqus单位_abaqus系列技巧3:关于有限元软件的单位制问题
  3. 详细介绍 Qt Creator 快捷捷应用
  4. python 数据库查询返回list或tuple
  5. 影响程序运行速度的几个因素
  6. php简单的日历代码,php日历代码(附演示效果)
  7. C++课程设计任务书
  8. XJOI一级五段题解(g++,即C++),也可视作C++算法竞赛教程
  9. ALSA 音频工具 amixer、aplay、arecord
  10. 腾讯T4级架构师用21个项目带你吃透379页深度学习TensorFlow实践pdf
  11. 如何在linux下配置网络桥接?-使初学者轻松远离ping不通的烦恼
  12. VS 2012 Dotfuscator and Analytics 'j8' 类型初始值设定项引发异常 解决方法
  13. Unity(8)-开启或关闭背景音乐
  14. 经典网络-ResNet论文及实践
  15. 土木工程成功转行Python,月入13k,太香......
  16. 今日,秋分。2021
  17. javaScript:打印等腰三角形
  18. RNN模型与NLP应用笔记(2):文本处理与词嵌入详解及完整代码实现(Word Embedding)
  19. 微信小程序的click事件会200~300ms的延迟如何解决
  20. DWG文件转换高清JPG文件

热门文章

  1. JMF调用摄像头粉屏的问题(win10 64位系统)
  2. Bloom-Filter算法 简介
  3. (原创)浅谈BUG资产,用例资产的作用
  4. fork vfork exit _exit (转)
  5. Leetcode--820:单词的压缩编码(java)
  6. 遍历矩阵每一行穷举_[LeetCode] 566. 重塑矩阵
  7. linux运行好麻烦,解析用Linux非常困难、必须用命令行、很老又丑陋及无法运行游戏...
  8. 北师大计算机试题五答案,北京师范大学计算机软件及理论2022考研招生分析、参考书、真题等复习指导解析...
  9. java将一个对象赋值给另一个对象_java一个对象赋值给另一个对象,支持平铺类和层级类间的互转...
  10. svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢