在自动化技术的不断发展过程中,我们往往也会遇到或做过自动化版本升级的任务,也会遇到各种各样的问题。
成都一家集口碑和实力的网站建设服务商,拥有专业的企业建站团队和靠谱的建站技术,10多年企业及个人网站建设经验 ,为成都1000多家客户提供网页设计制作,网站开发,企业网站制作建设等服务,包括成都营销型网站建设,品牌网站制作,同时也为不同行业的客户提供成都网站建设、成都网站制作的服务,包括成都电商型网站制作建设,装修行业网站制作建设,传统机械行业网站建设,传统农业行业网站制作建设。在成都做网站,选网站制作建设服务商就选成都创新互联。
对于 Web 自动化测试,目前很多公司还是很热衷使用 Selenium。较新开发的测试脚本可能都在使用 Selenium 4 版本,但是对于已经完成或者旧的测试脚本可能仍是 Selenium 3 版本,甚至是 Selenium 2 版本。
使用 Selenium 3 升级 Selenium 4 时,在某些情况下可能会发生一些问题,对于版本的升级后,会有一些弃用和更改等,本篇进行总结。
Selenium 4 取消了对旧的协议(JSON Wire 协议)的支持,默认情况下使用 W3C WebDriver 标准(协议)。对于大多数情况,此实现不会影响最终用户,主要的例外是 Capabilities 类和 Actions 类。
如果测试功能的结构不符合 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 中,查找元素的方法(FindsBy 接口)已被删除,因为它们仅用于内部使用。
修改前(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"));
修改前(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 并升级你的项目依赖项。
升级 Selenium 的过程取决于正在使用的构建工具。这里介绍 Java 中最常见的 Maven 和 Gradle。所需的最低 Java 版本仍然是 8。
修改前:
org.seleniumhq.selenium
selenium-java
3.141.59
修改后:
org.seleniumhq.selenium
selenium-java
4.0.0
进行更改后,可以在 pom.xml 文件所在的同一目录上执行 mvn clean compile 命令。
修改前:
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 命令。
使用 Python 最重要的变化是最低版本的要求。
Selenium 4 至少需要 Python 3.7 或更高版本。
从命令行升级,可以执行:
pip install selenium==4.0.0
超时中接收到的参数已从预期(长时间,时间单位)切换到预期(持续时间)。
修改前:
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);
可以将一组不同的功能合并到另一个功能集中,这会改变调用对象。现在,需要指定合并操作的结果。
修改前(结果,options 对象被修改了):
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("platformVersion", "Windows 10");
FirefoxOptions options = new FirefoxOptions();
options.setHeadless(true);
options.merge(capabilities);
修改后(调用的结果,merge 需要分配给一个对象):
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("platformVersion", "Windows 10");
FirefoxOptions options = new FirefoxOptions();
options.setHeadless(true);
options = options.merge(capabilities);
在 GeckoDriver 出现之前,Selenium 项目有一个驱动程序来实现自动化 Firefox(版本 < 48)。但是,不再需要此实现,因为它在最新版本的 Firefox 中不起作用。为避免升级到 Selenium 4 时出现重大问题,该 setLegacy 选项将显示为已弃用。建议停止使用旧的实现,只依赖 GeckoDriver。
以下代码将显示 setLegacy,升级后不被推荐使用。
FirefoxOptions options = new FirefoxOptions();
options.setLegacy(true);
该 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);
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)
网页标题:Selenium3升级到Selenium4应注意哪些
文章网址:http://www.shufengxianlan.com/qtweb/news19/51919.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联