一篇文章告诉你什么是—Selenium的元素等待

前言

今天我们来说说selenium的元素等待,废话不多说直接开始吧。

1、元素等待介绍

WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程。为了保证脚本运行的稳定性,需要脚本中添加等待时间。

2、为什么要设置元素等待

元素定位的时,可能出现脚本已经运行到定位某个元素的时候,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。换句话说就是代码执行的速度,快于页面元素加载的速度,我们需要等待页面元素全部加载完成之后,再做定位元素。元素等待本质是为了解决元素定位时序上不匹配的问题。

页面加载速度慢的原因:

  1. 由于网络速度原因。
  2. 电脑配置原因。
  3. 服务器处理请求原因。

3、Selenium中常用的元素等待方式

Selenium中常用的元素等待方式有三种:

  1. 强制等待:time.sleep()
  2. 隐式等待:implicitly_wait()
  3. 显式等待:WebDriverWait()

4、强制等待

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法。不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,如果设置的时间太短,元素还没有加载出来一样会报错。设置的时间太长,则会浪费时间。因而在实际UI自动化脚本开发中,这个方式一般比较少用。

5、隐式等待

(1)隐式等待介绍

WebDriver提供了mplicitly_wait()方法来实现隐式等待。隐式等待相当于设置全局等待,在定位元素时,对所有元素设置的超时时间。implicitly_wait()默认参数的单位为秒,默认设置超时时间为0,设置后这个隐式等待会在WebDriver对象实例的整个生命周期起作用。

从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,Driver(浏览器)要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,Driver(浏览器)也会继续等待页面上其他无关元素,直至整个页面加载完毕。所以与显式等待相比,可能会出现一些无效等待的情况。

如果超出了设置的时长,元素还没有被加载,则抛NoSuchElementException异常(可自己指定异常或自定义异常)。

(2)隐式等待示例


"""

1.学习目标:

掌握selenium隐式等待方法使用

2.操作

2.1 隐式等待方法

driver.implicitly_wait(最大等待时间,单位:秒)

2.2 隐式等待作用

在规定的时间内等待页面所有元素加载;

2.3 使用场景:

在有页面跳转的时候,可以使用隐式等待。

3.需求

实现selenium隐式等待方法

"""

# 1.导入selenium

from selenium import webdriver

import time

from selenium.common.exceptions import NoSuchElementException


# 2.打开浏览器

driver = webdriver.Chrome()


# 3.打开页面

url = "https://www.jd.com/"

driver.get(url)


# 4. 添加隐式等待

print("等待开始时间", time.time())

# 等待5秒钟,最多等待5秒。

# 如果在5秒内加载完成,加载完就继续执行。

driver.implicitly_wait(5)

print("等待结束时间", time.time())


# 5. 定位元素,点击链接

try:

driver.find_element_by_link_text("秒杀").click()

except NoSuchElementException as e:

print(e)

finally:

# 6.关闭浏览器

time.sleep(3)

driver.quit()


"""

输出结果:

等待开始时间 1590511914.654972

等待结束时间 1590511914.6569717

"""

说明:
在上面的案例中implicitly_wait()设置等待时长为5秒。这个5秒的设置并不针对页面上的某一个元素进行等待,也不是一个固定的等待时间。如果页面全部元素提前加载完,不用等待全部时间。如果直到超出设置时长(5秒)还没有定位到元素,则抛出异常。

6、显式等待

(1)显式等待介绍

显示等待是一种更智能的等待方式。显示等待比隐式等待更节省测试时间,个人更推荐使用显示等待的方式来判断页面元素是否出现。程序会每隔一段时间(默认为0.5秒,可自定义)执行一下判断条件,等待某个条件成立时继续执行,否则在达到最大时长抛出超时异常TimeoutException(实际上是until()抛出的TimeoutException异常,这里注意一下)。

WebDriverWait()类是由WebDirver提供的等待方法。在设置时间内,通过配合until()、until_not()、ExpectedCondition等条件的使用,默认每隔一段时间,轮询检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。这样的等待方式可避免无效等待,在实际应用中推荐使用该方法。

(2)显式等待语法


# 导包WebDriverWait

from selenium.webdriver.support.wait import WebDriverWait


# 显示等待方法

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

说明:

  • driver :WebDriver的驱动程序(IE、Firefox、Chrome等)。
  • timeout:最长超时时间,默认以秒为单位。
  • poll_frequency:休眠时间的间隔(步长)时间,默认为0.5秒(轮询频率)
  • ignored_exceptions:超时后的异常信息,默认值ignored_exceptions=None,因为通常配合until()方法使用,until()方法默认情况下抛TimeoutException异常。

(3)until()和until_not()方法

WebDriverWait()方法一般会和until()或until_not()方法配合使用。

@1、until(method, message=' ')

  • method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为True;
  • message:如果超时,抛出TimeoutException,将message位置传入异常。

@2、until_not(method, message=’ ’)

  • method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为False。
  • message:如果超时,抛出TimeoutException,将message位置传入异常。
注:until_not是当某元素消失或什么条件不成立则继续执行。

(4)显式等待的使用

调用方式如下

WebDriverWait(driver, 超时时长, 调用频率(可选,有默认值), 忽略异常(可选,有默认值)).until(可执行方法, 超时时返回的信息)

示例


"""

1.学习目标

必须掌握selenium中显式等待使用方法

2.操作步骤(语法)

2.1导入WebDriverWait类

2.2使用方法

WebDriverWait(driver,timeout,pol1_frequency=0.5).until(method)

driver:浏览器

timeout:最大等待时间,单位:秒(和隐式显示是一样的)

po11_frequency:轮询时间


until(method,message)

method:将一个方法作为参数传入


3.需求

在注册A页面中,使用显示等待来定位账号A输入相

"""

# 1.导入selenium

from selenium import webdriver

import time

from selenium.webdriver.support.wait import WebDriverWait

from selenium.common.exceptions import NoSuchElementException


# 2.打开浏览器

driver = webdriver.Chrome()


# 3.打开页面

url = "https://www.jd.com/"

driver.get(url)


# 4.使用显示等待,定位元素,点击链接

try:

print("等待开始时间", time.time())

"""

lambda x: x.find_element_by_link_text("秒杀")

是Python的匿名函数,主要记得这里要传入一个方法。

x = driver

不过以后在我们的实际开发中,不这样传入一个方法。

"""

login = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_link_text("秒杀"))

print("等待结束时间", time.time())

login.click()

except NoSuchElementException as e:

print(e)

finally:

# 5.关闭浏览器

time.sleep(3)

driver.quit()


"""

输出结果:

等待开始时间 1590511979.5245922

等待结束时间 1590511979.5725648

"""

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值