首页 > 其他分享 >Selenium4新在哪里

Selenium4新在哪里

时间:2022-11-10 18:22:05浏览次数:42  
标签:webdriver driver selenium element 哪里 Selenium4 import find

最新的selenium版本是4.0,已经于2021年10月发布。最新版本有4.6。

4.0版本,其有以下几点更新(有能力的可以看官方介绍,我现在的水平,只能百度其他人的文章):

一 https://www.jianshu.com/p/fa94fb4705e9

1 W3C webdriver标准化。

这个听着很糊涂,毕竟对标准不了解。文中举了一个例子:

Selenium3,终端通过JSON报文协议与浏览器在端节点连接。这要求API进行编码与译码。

Selenium4,测试将直接连接,不需要任何编译或译码API的请求,而是通过W3C协议,通过Java绑定将实现向前兼容,重点关注于W3C协议,而JSON报文协议不再使用

2 Selenium4 IDE

Chrome支持selenium IDE, 新的selenium IDE插件,完全基于node.js,而不再是老的基于HTML。

新的selenium IDE启动器将完全基于webdriver

新的命令行启动器将支持并发测试用例执行。并提供一些有用信息,例如测试花费时间,通过/失败测试用例数量

3 改良的Selenium Grid

Grid在原来有2个主要元素:Hub 和 Node

Hub扮演一个服务器的角色,在网络上以一个中心点控制所有测试机器。Node,是一台实际执行测试用例的测试主机。Hub分配测试执行给每一个具体有自己配对功能的Node。原启动时,通常在Node连接到hub时面对一些困难。

在selenium4中,grid不再需要单独的启动hub和node,只要启动了selenium服务,grid就会同时扮演hub和node的角色。

4 其它的界面更新,日志记录功能改善,更新的文档,不再多说。

二 https://www.xiaohongshu.com/discovery/item/6301270e000000001d034b03

1 元素定位  find_element(By.METHOD,"XXX")

不推荐定位方式直接写在方法名中,比如find_element_by_xx,都被整合成了一个方法find_element,通过By.method来选择你的查找元素方法(像我这种新手,看到这种直白的不同,更觉得有用)。老的方法虽然仍可使用,但在运行时会有DeprecationWarning。这种方法的使用需要引入类By, from selenium.webdriver.common.by import By

要记住,是common,不是com, 而且By 要大写

find_element(By.ID,"kw"), By.后面的ID,要全部大写

2 相对位置定位  find_element(locate_with(By.ID,"password").below(username)), find_element(with_tag_name("img".to_left_of(article_title))

在以前的版本中称之为“好友定位 friendly locators”

在selenium4中,find_element方法支持with(By)新方法,可返回RelativeLocator相对定位对象

举例1,登录功能,密码输入框在用户名输入框的下方

from selenium.webdriver.support.relative_locator import locate_with
username = driver.find_element(By.ID,"username")
password = driver.find_element(locate_with(By.ID, "password").below(username))

举例2,在获取下图所示所有文章标题左侧的图片地址

  获取文章标题的位置作为锚点

  通过with_tag_name查找元素的标签,要找的图片标签就是with_tag_name('img')

  在文章标题的左侧就是to_left_of(to_right_of,below,above,near,to_dict)

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name,locate_with   # 无法直接用By.TAG_NAME,用了就无法再用to_left_of。但可以用上面提到的locate_with

driver = webdriver.Chrome()
driver.get("https://www.caituotuo.top")

driver.find_element(By.XPATH,'//*[@id="scroll-down"]/i').click()
time.sleep(2)
# 文章标题
article_title = driver.find_element(By.CLASS_NAME,"article-title")
# 获取文章标题左侧的图片
elements = driver.find_elements(with_tag_name('img').to_left_of(article_title))  # to_left_of
# elements = driver.find_elements(locate_with(By.TAG_NAME,'img').to_left_of(article_title))  # to_left_of
for e in elements:
    print(e.get_attribute('src'))
    
driver.quit()

 3 打开新的标签页或容器 switch_to.new_window("tab") 或“window”

当我们需要测试打开几个页面或浏览器的场景时,在selenium3中的操作步骤:

  创建新的webdriver实例

  再使用windowhandle方法中的switch来执行操作

在selenium4中有一个新API,new_window,这意味着不需要再自己创建新的webdriver 实例

import time

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.caituotuo.top/")

driver.switch_to.new_window('tab')   # .new_window("tab")
driver.get("https://www.cnblogs.com/caituotuo")
print(driver.title)

driver.switch_to.new_window("window") # .new_window("window")
driver.get("https://www.caituotuo.top/")
print(driver.title)

time.sleep(3)
driver.quit()

 4 模拟移动设备  

作用:将浏览器调成移动端模式,用于测试移动端H5页面

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver.webdriver.Chrome()
driver.get("https://www.caituotuo.top/")
time.sleep(10)
driver.execute_cdp_cmd(           ### ###
    "Emulation.setDeviceMetricsOverride",
    {
        "width":400,
        "height":650,
        "mobile":True,
        "deviceScaleFactor":100
    }
)

driver.find_element(By.XPATH,"//*[@ID='scroll-down']/i").click()
time.sleep(3)
driver.quit()

 

感谢 蔡坨坨老师,文章非常有价值。

标签:webdriver,driver,selenium,element,哪里,Selenium4,import,find
From: https://www.cnblogs.com/guohui2022/p/16877987.html

相关文章