Selenium 3 升级到 Selenium 4 应注意哪些

一、升级前言

在自动化技术的注意不断发展过程中,我们往往也会遇到或做过自动化版本升级的升级任务,也会遇到各种各样的注意问题。

对于 Web 自动化测试,升级目前很多公司还是注意很热衷使用 Selenium。较新开发的升级测试脚本可能都在使用 Selenium 4 版本,但是注意对于已经完成或者旧的测试脚本可能仍是 Selenium 3 版本,甚至是升级 Selenium 2 版本。

使用 Selenium 3 升级 Selenium 4 时,注意在某些情况下可能会发生一些问题,升级对于版本的注意升级后,会有一些弃用和更改等,升级本篇进行总结。注意

二、升级关于支持的协议

Selenium 4 取消了对旧的协议(JSON Wire 协议)的支持,默认情况下使用 W3C WebDriver 标准(协议)。对于大多数情况,此实现不会影响最终用户,主要的例外是网站模板 Capabilities 类和 Actions 类。

三、Capabilities

如果测试功能的结构不符合 W3C,可能会导致会话无法启动。

以下是 W3C WebDriver 标准功能列表:

browserName

browserVersion (替换 version)

platformName (替换 platform)

acceptInsecureCerts

pageLoadStrategy

proxy

timeouts

unhandledPromptBehavior

修改前(Java):

DesiredCapabilities caps = DesiredCapabilities.firefox();

caps.setCapability("platform", "Windows 10");

caps.setCapability("version", "92");

caps.setCapability("build", myTestBuild);

caps.setCapability("name", myTestName);

WebDriver driver = new RemoteWebDriver(new URL(cloudUrl), caps);

修改后(Java):

FirefoxOptions browserOptions = new FirefoxOptions();

browserOptions.setPlatformName("Windows 10");

browserOptions.setBrowserVersion("92");

MapcloudOptions = new HashMap<>();

cloudOptions.put("build", myTestBuild);

cloudOptions.put("name", myTestName);

browserOptions.setCapability("cloud:options", cloudOptions);

WebDriver driver = new RemoteWebDriver(new URL(cloudUrl), browserOptions);

四、在Java中查找元素的方法

在 Java 中,查找元素的方法(FindsBy 接口)已被删除,因为它们仅用于内部使用。

1、查找单个元素 findElement*

修改前(Java):

driver.findElementByClassName("className");

driver.findElementByCssSelector(".className");

driver.findElementById("elementId");

driver.findElementByLinkText("linkText");

driver.findElementByName("elementName");

driver.findElementByPartialLinkText("partialText");

driver.findElementByTagName("elementTagName");

driver.findElementByXPath("xPath");

修改后(Java):

driver.findElement(By.className("className"));

driver.findElement(By.cssSelector(".className"));

driver.findElement(By.id("elementId"));

driver.findElement(By.linkText("linkText"));

driver.findElement(By.name("elementName"));

driver.findElement(By.partialLinkText("partialText"));

driver.findElement(By.tagName("elementTagName"));

driver.findElement(By.xpath("xPath"));

2、查找多个元素 findElements*

修改前(Java):

driver.findElementsByClassName("className");

driver.findElementsByCssSelector(".className");

driver.findElementsById("elementId");

driver.findElementsByLinkText("linkText");

driver.findElementsByName("elementName");

driver.findElementsByPartialLinkText("partialText");

driver.findElementsByTagName("elementTagName");

driver.findElementsByXPath("xPath");

修改后(Java):

driver.findElements(By.className("className"));

driver.findElements(By.cssSelector(".className"));

driver.findElements(By.id("elementId"));

driver.findElements(By.linkText("linkText"));

driver.findElements(By.name("elementName"));

driver.findElements(By.partialLinkText("partialText"));

driver.findElements(By.tagName("elementTagName"));

driver.findElements(By.xpath("xPath"));

五、升级依赖

检查安装 Selenium 4 并升级你的项目依赖项。

1、Java

升级 Selenium 的过程取决于正在使用的构建工具。这里介绍 Java 中最常见的 Maven 和 Gradle。所需的最低 Java 版本仍然是 8。

(1)Maven

修改前:

org.seleniumhq.selenium

selenium-java

3.141.59

</dependencies>

修改后:

org.seleniumhq.selenium

selenium-java

4.0.0

</dependencies>

进行更改后,可以在 pom.xml 文件所在的同一目录上执行 mvn clean compile 命令。

(2)Gradle

修改前:

plugins {

id java

}

group org.example

version 1.0-SNAPSHOT

repositories {

mavenCentral()

}

dependencies {

testImplementation org.junit.jupiter:junit-jupiter-api:5.7.0

testRuntimeOnly org.junit.jupiter:junit-jupiter-engine:5.7.0

implementation group: org.seleniumhq.selenium, name: selenium-java, version: 3.141.59

}

test {

useJUnitPlatform()

}

修改后:

plugins {

id java

}

group org.example

version 1.0-SNAPSHOT

repositories {

mavenCentral()

}

dependencies {

testImplementation org.junit.jupiter:junit-jupiter-api:5.7.0

testRuntimeOnly org.junit.jupiter:junit-jupiter-engine:5.7.0

implementation group: org.seleniumhq.selenium, name: selenium-java, version: 4.0.0

}

test {

useJUnitPlatform()

}

进行更改后,可以在 build.gradle 文件所在的同一目录上执行 ./gradlew clean build 命令。

2、高防服务器Python

使用 Python 最重要的变化是最低版本的要求。

Selenium 4 至少需要 Python 3.7 或更高版本。

从命令行升级,可以执行:

pip install selenium==4.0.0

六、潜在错误和弃用消息

1、Java

(1)等待和超时

超时中接收到的参数已从预期(长时间,时间单位)切换到预期(持续时间)。

修改前:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

driver.manage().timeouts().setScriptTimeout(2, TimeUnit.MINUTES);

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

修改后:

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

driver.manage().timeouts().scriptTimeout(Duration.ofMinutes(2));

driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(10));

(2)等待现在也需要不同的参数,WebDriverWait 现在期望的是持续时间,而不是以秒和毫秒为单位的长时间。

FluentWait 中的 withTimeout 和 pollingEvery 方法已从预期(长时间,时间单位)切换到预期(持续时间)。

修改前:

new WebDriverWait(driver, 3).until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));

Waitwait = new FluentWait(driver)

.withTimeout(30, TimeUnit.SECONDS)

.pollingEvery(5, TimeUnit.SECONDS)

.ignoring(NoSuchElementException.class);

修改后:

new WebDriverWait(driver, Duration.ofSeconds(3)).until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));

Waitwait = new FluentWait(driver)

.withTimeout(Duration.ofSeconds(30))

.pollingEvery(Duration.ofSeconds(5))

.ignoring(NoSuchElementException.class);(2)合并功能不再更改调用对象

可以将一组不同的功能合并到另一个功能集中,这会改变调用对象。现在,需要指定合并操作的结果。

修改前(结果,options 对象被修改了):

MutableCapabilities capabilities = new MutableCapabilities();

capabilities.setCapability("platformVersion", "Windows 10");

FirefoxOptions options = new FirefoxOptions();

options.setHeadless(true);

options.merge(capabilities);

修改后(调用的结果,merge 需要分配给一个对象):

(3)火狐旧版MutableCapabilities capabilities = new MutableCapabilities();

capabilities.setCapability("platformVersion", "Windows 10");

FirefoxOptions options = new FirefoxOptions();

options.setHeadless(true);

options = options.merge(capabilities);

在 GeckoDriver 出现之前,Selenium 项目有一个驱动程序来实现自动化 Firefox(版本 < 48)。云南idc服务商但是,不再需要此实现,因为它在最新版本的 Firefox 中不起作用。为避免升级到 Selenium 4 时出现重大问题,该 setLegacy 选项将显示为已弃用。建议停止使用旧的实现,只依赖 GeckoDriver。

以下代码将显示 setLegacy,升级后不被推荐使用。

FirefoxOptions options = new FirefoxOptions();

options.setLegacy(true);(4)BrowserType

该 BrowserType 接口已经存在了很长时间,但它已被弃用,取而代之的是新 Browser 接口。

修改前:

MutableCapabilities capabilities = new MutableCapabilities();

capabilities.setCapability("browserVersion", "92");

capabilities.setCapability("browserName", BrowserType.FIREFOX);

修改后:

MutableCapabilities capabilities = new MutableCapabilities();

capabilities.setCapability("browserVersion", "92");

capabilities.setCapability("browserName", Browser.FIREFOX);

2、Python

executable_path 已被弃用,请传入 Service 对象。

在 Selenium 4 中,需要 executable_path 从 Service 对象设置驱动程序以防止出现弃用警告(或者不要设置路径,而是确保所需的驱动程序位于系统路径上)。

修改前:

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)

修改后:

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)
IT科技类资讯
上一篇:朝着更环保、面向未来的布线基础设施迈进
下一篇:机架PDU未来发展趋势