大佬教程收集整理的这篇文章主要介绍了『心善渊』Selenium3.0基础 — 23、Selenium的元素等待,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_674_41@WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程。为了保证脚本运行的稳定性,需要脚本中添加等待时间。
在元素定位的时,可能出现脚本已经运行到定位某个元素的时候,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。换句话说就是代码执行的速度,快于页面元素加载的速度,我们需要等待页面元素全部加载完成之后,再做定位元素。元素等待本质是为了解决元素定位时序上不匹配的问题。
页面加载速度慢的原因:
SELEnium中常用的元素等待方式有三种:
设置等待最简单的方法就是强制等待,其实就是@H_674_41@time.sleep()方法。不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,如果设置的时间太短,元素还没有加载出来一样会报错。设置的时间太长,则会浪费时间。因而在实际UI自动化脚本开发中,这个方式一般比较少用。
@H_674_41@WebDriver提供了@H_674_41@mplicitly_wait()方法来实现隐式等待。隐式等待相当于设置全局等待,在定位元素时,对所有元素设置的超时时间。@H_674_41@implicitly_wait()默认参数的单位为秒,默认设置超时时间为0,设置后这个隐式等待会在@H_674_41@WebDriver对象实例的整个生命周期起作用。
从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,@H_674_41@Driver(浏览器)要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,@H_674_41@Driver(浏览器)也会继续等待页面上其他无关元素,直至整个页面加载完毕。所以与显式等待相比,可能会出现一些无效等待的情况。
如果超出了设置的时长,元素还没有被加载,则抛@H_674_41@NoSucHelementexception异常(可自己指定异常或自定义异常)。
@H_674_41@""" 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 """
说明:
在上面的案例中@H_674_41@implicitly_wait()设置等待时长为5秒。这个5秒的设置并不针对页面上的某一个元素进行等待,也不是一个固定的等待时间。如果页面全部元素提前加载完,不用等待全部时间。如果直到超出设置时长(5秒)还没有定位到元素,则抛出异常。
显示等待是一种更智能的等待方式。显示等待比隐式等待更节省测试时间,个人更推荐使用显示等待的方式来判断页面元素是否出现。程序会每隔一段时间(默认为0.5秒,可自定义)执行一下判断条件,等待某个条件成立时继续执行,否则在达到最大时长抛出超时异常@H_674_41@TimeoutException(实际上是@H_674_41@until()抛出的@H_674_41@TimeoutException异常,这里注意一下)。
@H_674_41@WebDriverWait()类是由@H_674_41@WebDirver提供的等待方法。在设置时间内,通过配合@H_674_41@until()、@H_674_41@until_not()、@H_674_41@ExpectedCondition等条件的使用,默认每隔一段时间,轮询检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。这样的等待方式可避免无效等待,在实际应用中推荐使用该方法。
@H_674_41@# 导包WebDriverWait from SELEnium.webdriver.support.wait import WebDriverWait # 显示等待方法 WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=NonE)
说明:
@H_674_41@WebDriverWait()方法一般会和@H_674_41@until()或@H_674_41@until_not()方法配合使用。
@1、until(method, message=' ')
@2、until_not(method, message=’ ’)
调用方式如下:
@H_674_41@WebDriverWait(driver, 超时时长, 调用频率(可选,有默认值), 忽略异常(可选,有默认值)).until(可执行方法, 超时时返回的信息)
示例:
@H_674_41@""" 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 """
以上是大佬教程为你收集整理的『心善渊』Selenium3.0基础 — 23、Selenium的元素等待全部内容,希望文章能够帮你解决『心善渊』Selenium3.0基础 — 23、Selenium的元素等待所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。