首页 > 编程语言 >Selenium 4.0beta:读源码学习新功能

Selenium 4.0beta:读源码学习新功能

时间:2023-11-03 10:32:13浏览次数:43  
标签:webdriver 4.0 Selenium selenium 源码 import dr find

Selenium 4 源码分析

这一篇文章我们来分析Selenium 4 python版源码。

除非你对Selenium 3的源码烂熟于心,否则通过对比工具分析更容易看出Selenium 4更新了哪些API。

文件对比工具推荐 Beyond Compare

Selenium 4.0beta:读源码学习新功能_Chrome

驱动支持

Selenium 4 去掉了androidblackberryphantomjs 等驱动支持。

  • Selenium 对 android的支持本来就比较鸡肋,我想几乎没有人用Selenium来做android自动化测试,所以,去掉android专注于 Web 才是Selenium的定位。
  • Blackberry 是针对黑莓手机的驱动,嗯!没落的黑莓手机。
  • phantomjs 自从有了 chrome headless 模式,phantomjs 几乎没有维护的必要的。

Selenium 增加了 chromiumwpewebkit 驱动。

  • chromium 是一个开源浏览器项目,chrome、chromiumEdge 都是基Chromium开发的。
  • wpewebkit 关于wpewebkit的资料很少,只找到了一名介绍为低端设备优化的WebKit端口

chromium 不需要直接使用,它主要是给chrome、chromiumEdge 继承的父类,如果要直接使用,必须要指定 browser_namevendor_prefix 两个参数。

from selenium.webdriver.chromium.webdriver import ChromiumDriver

dr = ChromiumDriver(browser_name='??', vendor_prefix='??')
'''
- browser_name - Browser name used when matching capabilities.
- vendor_prefix - Company prefix to apply to vendor-specific WebDriver extension commands.
'''

wpewebkit 是可以直接使用,但是驱动应该只支持 Linux系统,我没做验证。

from selenium import webdriver

dr = webdriver.WPEWebKit()

弃用定位方法

以前常用的定位方法将被弃用。

warnings.warn("find_element_by_* commands are deprecated. Please use find_element() instead")

from selenium import webdriver

dr = webdriver.Chrome()

dr.get("https://www.baidu.com")

dr.find_element_by_id("kw").send_keys("selenium4")
dr.find_element_by_id("su").click()

find_element_by_xx 将被弃用,推荐使用find_element()

from selenium import webdriver
from selenium.webdriver.common.by import By
dr = webdriver.Chrome()
dr.get("https://www.baidu.com")

dr.find_element(By.ID, "kw").send_keys("selenium grid4")
dr.find_element(By.ID, "su").click()
dr.close()

上面的定位写法在 selenium3 一直是被支持的,只是我们一般很少使用。

相对定位

这是 Selenium4 的一个亮点,官方称他为相对定位, 官方博客对相对定位的说明。

想想我们如何描述元素在页面上的位置。想想你在电话里会怎么做。你永远不会谈论原始DOM,啊,找到嵌套在span标签中的第五个div标签,其id为foo。你永远不会这么说!相反,当谈到内容在页面上的位置时,你会说只需在图片上方和链接右侧找到该内容

很久以前,一个名为Sahi的项目开始定位这样的元素。在Selenium4中,我们称它们为相对定位器。你有时可能会看到我们将它们称为友好定位器,因为最初的实现称它们为友好定位器,但相对更好地描述了它们的工作方式。我们有几个:near, above, below, to_left_of, to_right_of。它们允许你用人类语言谈论元素在页面上的位置。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name

dr = webdriver.Chrome()
dr.get("https://www.xx.com")

lowest = dr.find_element(By.ID, "below")
elems = dr.find_elements(with_tag_name("p").above(lowest))

ids = [el.get_attribute('id') for el in elems]
print(ids)

新增API

remote.webdriver文件的WebDriver 类(所有浏览器类都继承该类)新增的几个API无关痛痒,而且还没注解,所以暂时不清楚具体用法。

  • log: 无注释
  • pin_script:无注释
  • unpin: 无注释
  • get_pinned_scripts: 无注释
dr.pin_script(script="??")
dr.unpin(script_key="??")
print(dr.get_pinned_scripts())

不过,我也发现了几个有用的API

  • 打开并切换到新窗口/标签。
dr.switch_to.new_window("window")
dr.switch_to.new_window("tab")
  • 获取不同设置的超时间。
from selenium import webdriver

dr = webdriver.Chrome()
dr.implicitly_wait(10)
dr.set_page_load_timeout(3)
dr.set_script_timeout(7)

print(dr.timeouts.implicit_wait)
print(dr.timeouts.page_load)
print(dr.timeouts.script)
  • 获取当前页面PDF文件。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.headless = True
dr = webdriver.Chrome(options=chrome_options)
dr.get("https://docs.pytest.org/en/stable/#documentation")

# 获取当前页面PDF文件
print(dr.print_page())

Trio CDP

common目录下面多出bididevtools 两个子目录。查看源码 提供了Trio CDP的项目连接。

https://github.com/HyperionGray/trio-chrome-devtools-protocol

CDP全称:Chrome DevTools Protocol

关于CDP的介绍,官方有一段介绍:

CDP是一种基于Chrome的浏览器中启用调试器而开发的协议。它是一个非正式协议,不是一个面向用户的API,允许您反省浏览器。 Puppeteer和Cypress者建立在该协议上,在测试和浏览器之间引入一个network hop,随着网络延迟的增加,这种方式会导致测试速度变慢。更复杂的是,由于CDP被设计为一个调试协议,所以在不同版本之间它可以在没有任何通知的情况下进行更改。这就是为什么Puppeter和Cypress与特定版本的浏览器绑定在一起,这给作为测试作者的您带来了一个难题:如何在浏览器的多个版本上进行测试?

尽管如此,使用CDP还是有很多可能性,这就是为什么我们在Selenium4中增加了对它的支持。事实上,我们的一些新功能是建立在它之上的(尽管我们隐藏了细节!)

代码注解的示例:

from selenium import webdriver
from selenium.webdriver.common.bidi.console import Console

dr = webdriver.Chrome()

dr.get("https://www.baidu.com")


with dr.log.add_listener(Console.log) as messages:
    dr.execute_script("console.log('I like cheese')")
assert messages["message"] == "I love cheese"

最后

官方博客里还提到了:

  • 对网站的身份验证:来解决网站的登录问题。
  • 拦截网络流量:来解决网络的稳定性。

官方文档和源码中都没找到例子或API,后续再做研究。

标签:webdriver,4.0,Selenium,selenium,源码,import,dr,find
From: https://blog.51cto.com/fnngj/8162073

相关文章

  • Selenium 4.0beta: Grid 工作原理
    Selenium4.0beta版已经发布,那么距离正式版已经不远了,在Selenium4.0中变化比较大的就是Grid了,本文翻译了官方文档,重点介绍Grid4的工作原理SeleniumGrid3工作原理Hub中介和管理接受运行测试的请求从客户端获取指令并在节点上远程执行它们管理线程Hub是发送所有测试的中心点。每......
  • 【专题】中国汽车基础软件发展白皮书4.0报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34132自18世纪中期工业革命以来,人类进入工业社会。在历次工业革命中,人类通过发明创造和管理革新,改进生产方式、降低成本、提高效率,随之而来的是生活、物质、文化、教育等各方面的变化,人际关系和社会结构也得以重塑。如今,数字化技术的发展为工业注入......
  • Python selenium操作cookie
    如何使用Selenium处理Cookie,今天彻底学会了(qq.com)"""1.学习目标:掌握selenium对cookie操作2.语法2.1获取所有cookiedriver.get.cookies()返同列表格式字典类型[{},{},{}]2.2添加cookiedriver.add_cookie(参数)参数:字典格......
  • Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
    一、前言在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架中,我们可以使用声明式事务和编程式事务来管理事务处理。其中事务的坑也是不少,比较常见的就是事务失效,大家......
  • 基于Android的记录生活APP-计算机毕业设计源码+LW文档
    摘 要近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,记录生活信息利用计算机网络实现信息化管理,使整个记录生活管理的发展和服务水平有显著提升。本文拟采用Android平台进行开发,使用java技术和Springboot搭建系统框架,后台使用MySQL数......
  • 基于Android的XX校园交流-计算机毕业设计源码+LW文档
    摘  要随着互联网时代的发展,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,随着各行业的不断发展,XX校园交流APP建设也逐渐进入了信息化的进程。这个App的设计主要包括前台页面的设计和方便用户互动的后端数据库,而前端软件的......
  • nginx报错 [error] 612#4188: CreateFile() "C:\yjzx\nginx-1.24.0/logs/nginx.pid"
    背景无论是nginx-sstop还是nginx-sreload命令,都会出现这个错误。[error]612#4188:CreateFile()"C:\yjzx\nginx-1.24.0/logs/nginx.pid"failed(2:Thesystemcannotfindthefilespecified)查找logs下nginx.pid文件确实没有创建成功,在网上查找了下了解决办法。发......
  • 发布会回放|Gradio 4.0 正式发布!
     Gradio的目标是使机器学习模型的演示更容易定制和访问,以满足不同用户的需求。在4.0正式版的发布活动上,HuggingFace的Gradio团队介绍了自己为了提高机器学习模型的可访问性所做的工作,以及如何创建自定义组件。Gradio是一个用于构建机器学习模型演示的工具,任何人都可以......
  • Syntax Error: Error: Node Sass version 8.0.0 is incompatible with ^4.0.0.
    依赖关系如图: 如果报如题这个错误,并且按照上面node-sass官网的依赖关系依赖对了node版本还不行,那么,请删除node-sassnpmuninstallnode-sass然后执行npmisass--save-dev然后运行项目,如果出现类似图片中的错误时,别慌,把所有的/deep/更换成::v-deepSyntaxError:Sa......
  • Docker 中使用Selenium Grid
    第一步拉取hub镜像:dockerpullselenium/hub拉取chrome浏览器镜像:dockerpullselenium/node-chrome启动hub:dockerrun-p5001:4444-d--namehubselenium/hubdockerrun--name=hub-p5001:4444-eGRID_TIMEOUT=0-eGRID_THROW_ON_CAPABILITY_NOT_PRESENT=true-e......