前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >selenium4的一些相关更新

selenium4的一些相关更新

原创
作者头像
Meccer
发布2021-12-20 13:55:15
1.4K0
发布2021-12-20 13:55:15
举报
文章被收录于专栏:测试学习之路测试学习之路

一、升级依赖关系

使用 Python 的最重要变化是所需的最低版本,Selenium 4 将至少需要 Python 3.7 或更高版本。

在python环境下,基于pip命令行做升级的话, 你可以执行:

1、在python3.7+环境下

执行如下命令会自动安装selenium4以上最新版。

代码语言:javascript
复制
pip3 install selenium

如果需要安装selenium3的相关版本,需要指定版本安装。

代码语言:javascript
复制
pip3 install selenium==3.14.0

如果在python3.7以上环境,但是pip版本在19以下,会出现依赖问题,而导致安装最新版selenium失败的问题,解决方法就是升级pip。

代码语言:javascript
复制
python -m pip install --upgrade pip

或者通过get-pip.py文件升级(私聊作者获取最新版),将其下载到本地:d:\get-pip.py

可以通过执行该文件升级pip,主要用于pip崩溃后的重装和升级。

代码语言:javascript
复制
python d:\get-pip.py

2、在python3.6环境下

执行如下命令会自动安装selenium3.14.0版本。

代码语言:javascript
复制
pip3 install selenium

二、新版本的差异

Selenium 4 移除了对旧协议的支持,并在引擎盖下默认使用 W3C WebDriver 标准。对于大多数情况,此实施不会影响最终用户,主要的例外是Capabilities和Actions类。

1、capabilities的更新

如果测试功能的结构不符合 W3C,可能会导致会话无法启动,以下是 W3C WebDriver 标准功能列表:

  • browserName
  • browserVersion(代替version)
  • platformName(代替platform)
  • acceptInsecureCerts
  • pageLoadStrategy
  • proxy
  • timeouts
  • unhandledPromptBehavior

上面列表中未包含的任何功能都需要包含供应商前缀。这适用于浏览器特定功能以及云供应商特定功能。例如,如果您的云供应商为您的测试使用build和name功能,您需要将它们包装在一个cloud:options块中(与您的云供应商核对适当的前缀)。

旧版本的写法(selenium3):

代码语言:javascript
复制
caps = {}
caps['browserName'] = 'firefox'
caps['platform'] = 'Windows 10'
caps['version'] = '92'
caps['build'] = my_test_build
caps['name'] = my_test_name
driver = webdriver.Remote(cloud_url, desired_capabilities=caps)

新版本的写法(selenium4+):

代码语言:javascript
复制
from selenium.webdriver.firefox.options import Options as FirefoxOptions
options = FirefoxOptions()
options.browser_version = '92'
options.platform_name = 'Windows 10'
cloud_options = {}
cloud_options['build'] = my_test_build
cloud_options['name'] = my_test_name
options.set_capability('cloud:options', cloud_options)
driver = webdriver.Remote(cloud_url, options=options)

2、定位元素方法的更新

旧版本的写法(selenium3):

代码语言:javascript
复制
driver.find_element_by_class_name("className")
driver.find_element_by_css_selector(".className")
driver.find_element_by_id("elementId")
driver.find_element_by_link_text("linkText")
driver.find_element_by_name("elementName")
driver.find_element_by_partial_link_text("partialText")
driver.find_element_by_tag_name("elementTagName")
driver.find_element_by_xpath("xpath")

以上写法在selenium4中已经失效,不能使用。

新版本的写法(selenium4+):

代码语言:javascript
复制
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME,"xx")
driver.find_element(By.CSS_SELECTOR,"xx")
driver.find_element(By.ID,"xx")
driver.find_element(By.LINK_TEXT,"xx")
driver.find_element(By.NAME,"xx")
driver.find_element(By.PARITIAL_LINK_TEXT,"xx")
driver.find_element(By.TAG_NAME,"xx")
driver.find_element(By.XPATH,"xx")

3、定位多个元素方法的更新

查找多个元素 使用find_elements*。

旧版本的写法(selenium3):

代码语言:javascript
复制
driver.find_elements_by_class_name("className")
driver.find_elements_by_css_selector(".className")
driver.find_elements_by_id("elementId")
driver.find_elements_by_link_text("linkText")
driver.find_elements_by_name("elementName")
driver.find_elements_by_partial_link_text("partialText")
driver.find_elements_by_tag_name("elementTagName")
driver.find_elements_by_xpath("xpath")

新版本的写法(selenium4+):

代码语言:javascript
复制
driver.find_elements(By.CLASS_NAME,"xx")
driver.find_elements(By.CSS_SELECTOR,"xx")
driver.find_elements(By.ID,"xx")
driver.find_elements(By.LINK_TEXT,"xx")
driver.find_elements(By.NAME,"xx")
driver.find_elements(By.PARITIAL_LINK_TEXT,"xx")
driver.find_elements(By.TAG_NAME,"xx")
driver.find_elements(By.XPATH,"xx")

4、executable_path的更新

executable_path 已弃用, 请传递一个服务对象。

旧版本的写法(selenium3):

代码语言:javascript
复制
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options)

新版本的写法(selenium4+):

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
service = ChromeService(executable_path=CHROMEDRIVER_PATH)
driver = webdriver.Chrome(service=service, options=options)

三、Selenium 4新增了相对定位

Selenium 4中带来了相对定位这个新功能,在以前的版本中被称之为"好友定位 (Friendly Locators)"。 它可以帮助你通过某些元素作为参考来定位其附近的元素。

现在可用的相对定位有:

  • above 元素上
  • below 元素下
  • toLeftOf 元素左
  • toRightOf 元素右
  • near 附近

findElement 方法现在支持with(By)新方法其可返回RelativeLocator相对定位对象。

1、如何工作

Selenium是通过使用JavaScript函数返回对应元素的各种属性例如:右,左,下,上。

2、above() 元素上

返回当前指定元素位置上方的WebElement对象

代码语言:javascript
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

passwordField = driver.find_element(By.ID, "password")
emailAddressField = driver.find_element(locate_with(By.TAG_NAME, "input").above(passwordField))

2、below() 元素下

返回当前指定元素位置下方的WebElement对象。

代码语言:javascript
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

emailAddressField = driver.find_element(By.ID, "email")
passwordField = driver.find_element(locate_with(By.TAG_NAME, "input").below(emailAddressField))

3、toLeftOf() 元素左

返回当前指定元素位置左方的WebElement对象。

代码语言:javascript
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

submitButton = driver.find_element(By.ID, "submit")
cancelButton = driver.find_element(locate_with(By.TAG_NAME, "button").
to_left_of(submitButton))

4、toRightOf() 元素右

返回当前指定元素位置右方的WebElement对象。

代码语言:javascript
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

cancelButton = driver.find_element(By.ID, "cancel")
submitButton = driver.find_element(locate_with(By.TAG_NAME, "button").
to_right_of(cancelButton))

4、near() 附近

代码语言:javascript
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with

emailAddressLabel = driver.find_element(By.ID, "lbl-email")
emailAddressField = driver.find_element(locate_with(By.TAG_NAME, "input").
near(emailAddressLabel))

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、升级依赖关系
    • 1、在python3.7+环境下
      • 2、在python3.6环境下
      • 二、新版本的差异
        • 1、capabilities的更新
          • 2、定位元素方法的更新
            • 3、定位多个元素方法的更新
              • 4、executable_path的更新
              • 三、Selenium 4新增了相对定位
                • 1、如何工作
                  • 2、above() 元素上
                    • 2、below() 元素下
                      • 3、toLeftOf() 元素左
                        • 4、toRightOf() 元素右
                          • 4、near() 附近
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档