从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 10--基础知识 6--元素等待方式和内联框架
测试学习记录,仅供参考!
元素等待
元素等待是 web 自动化中比较重要的一个概念,在 selenium 中有三种等待方式,分别是 强制等待、显式等待、隐式等待;
为什么在做元素定位时需要用到等待呢?
假如说运行的脚本没有加任何等待, 在打开浏览器时受到 页面加载、一系列跟网速相关的、跟服务器响应时间相关的、跟硬件等等一系列的关系,导致页面还没有加载出来,代码脚本(python 执行很快的)却已经执行完了;这个时候若没有等待的话,就会报错提醒没有找到元素,所以需要用到等待相关的;
selenium 元素等待方式
1、在项目根目录下新建一个名称为 element_waits.py 的 Python 文件;
强制等待
2、强制性的让浏览器页面等待多少时间后才去找元素定位;可以直接使用 time.sleep(xx) 或者引入 time 时间模块调用 sleep 函数设置等待时间,一般默认单位是秒,设置多长时间,程序代码脚本在执行过程中就会等待多少时间;例如:设置 10 秒钟,而页面元素在第 5 秒钟的时候就以及加载出来了,后面的 5 秒钟时间其实就是冗余的等待时长;强制等待方式会导致程序代码脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过 2 秒,一般 1 秒、 0.5秒;在写框架的时候,最好少用强制等待,太费时间了,在企业级项目代码中,一般不推荐使用这种等待方式;
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/select.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 强制等待
sleep(5)
ele = driver.find_element(By.ID, 'j_idt87:lang_label')
print(ele)# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()
显示等待
3、显示等待就是在代码中明确指定了的等待时间,等待元素出来之后就马上进行下一步的操作;
简单来说就是“明确要等到某一个元素出现后,根据设置的等待时长一直等,在规定的时间内如果都没有找到的话就抛出一个异常”;
显示等待的作用域是单个元素;当你知道某一个元素定位加载有点慢的时候,可以去使用显示等待去找单个元素;
就是明确的要等到某个元素的出现,等不到就一直等,除非在规定的时间内都没有找到,那么就抛出异常;
调用 WebDriverWait 类,类里面 WebDriverWait(driver, 10) 第一个参数是浏览器驱动对象 driver,第二个参数是 设置的等待时长,然后再调用 until() 方法,方法里面调用刚刚导入的 EC 类 .点 调用 等待这个元素出现 方法 visibility_of_element_located() ,需注意这个方法里面跟的是元组;
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 引入显示等待 WebDriverWait 类
from selenium.webdriver.support.ui import WebDriverWait
# 引入显示等待异常 expected_conditions 库 --用 as 取个别名 EC
from selenium.webdriver.support import expected_conditions as EC# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/select.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 强制等待
# sleep(5)
# ele = driver.find_element(By.ID, 'j_idt87:lang_label')
# print(ele)# 显示等待--等待元素可见
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'j_idt87:lang_label')))
print(element)# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()
隐式等待
4、 在创建浏览器驱动 driver 对象时,为浏览器对象创建一个等待时间;这个方法是得不到某个元素就等待一段时间,直到拿到某个元素就立即进行下一个操作;
隐式等待是在整个生命周期都会生效的一个时间;
隐式等待的作用域是全局的;
设置隐式等待时间可以作用整个项目中的元素等待,这样有优点也有缺点:
优点:可以保证元素在规定的时间内显示出来,避免了如果页面还没有完全加载定位元素失败的问题;
缺点:如果元素定位写错,会增加整个代码的执行时间;
所以使用的时候,一般建议设置隐式等待时间为3~6秒。如果设置全局的等待时间为3秒,那么有些网站页面中有一些特殊控件,比如注册对话框等等,至少要9秒才能加载出来。针对这种特殊元素 可以设置 显示等待。
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 引入显示等待 WebDriverWait 类
from selenium.webdriver.support.ui import WebDriverWait
# 引入显示等待异常 expected_conditions 库 --用 as 取个别名 EC
from selenium.webdriver.support import expected_conditions as EC# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/select.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 强制等待
# sleep(5)
# ele = driver.find_element(By.ID, 'j_idt87:lang_label')
# print(ele)# 显示等待--等待元素可见
# element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'j_idt87:lang_label')))
# print(element)# 隐式等待--设置隐式等待时间为10秒
driver.implicitly_wait(10)driver.find_element(By.ID, 'j_idt87:city_label')
driver.find_element(By.ID, 'j_idt87:lang_label')# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()
显示等待和隐式等待的区别:
作用范围:
显示等待仅在特定条件和特定元素上生效,而隐式等待是全局性的,影响 webDriver 实例的每一个定位元素操作;
等待方式:
显示等待基于具体的条件等待,可以更加灵活的等待元素的可见性,而隐式等待是一个全局等待,简单的等到固定的时间,对所有的定位操作都生效;
语法和使用:
显示等待使用 WebDriverWait 和 expected_conditions 类来指定等待条件和超时时间,而隐式等待通过 implicitly_wait 方法设置等待时间;
异常处理:
显示等待使用 try/except 块(异常块)来捕捉 TimeoutException 异常(超时异常,在设置的时间范围内没有找到元素),可以在超时的时候自定义处理逻辑,而隐式等待会在每一个定位元素的时候自动等待指定的时间,不需要显示异常处理。
5、若在以后做框架设计的时候,因为知道某一个元素很慢的话,可以使用显示等待,所以显示等待是用的比较多的;
内联框架(内嵌框架)
掌握 frame、iframe 定位和切入切出;
简介
百度百科快速通道
iframe是 HTML 标签,用于在网页中创建内联框架,支持在当前文档内嵌入另一个独立 HTML 文档或浮动框架。其核心功能是实现页面内容的嵌套与分割,常见于广告加载、第三方插件集成等场景 。
该标签通过定义,需配合属性指定嵌入文档地址。若浏览器不支持,可在标签内添加备用文本以实现兼容。HTML5 新增了等属性以增强安全控制。微软 .NET Framework 的类提供了对标签的服务器端编程访问,例如通过属性设置嵌入路径。
在规范演进中,HTML4.1 Strict DTD 和 XHTML1.0 Strict DTD 未收录该标签。随着 HTML5 标准的推广,iframe 被重新纳入规范并扩展功能属性,成为现代网页开发中跨文档内容嵌入的主流解决方案。
<iframe> 标签规定一个内联框架。
一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。
提示:HTML 与 XHTML 之间的差异:在HTML4.1 Strict DTD和XHTML1.0 Strict DTD中,不支持iframe元素。
示例:
6、 以测试网站 https://www.leafground.com/frame.xhtml 页面中的 内联框架 iframe 为例;
若页面元素在内联框架 iframe 里面,需要先使用 driver.switch_to.frame 切换到内联框架中,然后再去元素定位去操作内联框架中的元素,操作完了之后记得使用 driver.switch_to.default_content() 退出 内联框架 回到最外层;
7、在项目根目录下新建一个名称为 iframe_demo.py 的 Python 文件;
# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/frame.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 通过索引的方式切换到第一个iframe
driver.switch_to.frame(0)# 在定位iframe内嵌框架里面的元素
driver.find_element(By.XPATH, '//*[@id="Click"]').click()# 切换到父窗口(退出内嵌框架)
driver.switch_to.default_content()# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()
8、在 web 页面中,有时候会使用 <iframe>(内联框架)标签来嵌套另一个 html 文档 ,<iframe> 允许在一个页面中嵌套另一个页面,这样可以实现页面的分隔、划分。
9、注意:<frame>在 HTML5 中已经被废弃,而<iframe>是 HTML 推荐使用的标签,更具有灵活性和兼容性。
未完待续。。。