文本

10种Selenium自定义功能可简化Web测试

每当我们想到自动化任何Web应用程序时,我们想到的第一个明显的名字就是“ Selenium”。 多年来,Selenium项目的发展过程非常有趣,并已成为最受欢迎的项目。 目前,由于它的志愿者维护者,贡献者和周围充满活力的社区,它几乎是几乎所有类型的Web应用程序自动化的事实上的标准。

为了确保您了解Selenium是什么,它是一个开放源代码的总体项目,是一个生态系统,由多个库,服务器和工具组成,可帮助我们使Web浏览器自动化并从而帮助进行Web应用程序测试。

其核心是“ Selenium WebDriver”,这是一个远程控制界面,可控制用户代理并与Web浏览器进行交互,从而模仿用户与Web元素的交互。 它借助受支持的语言绑定(用Java,Python,C#,Ruby,JavaScript编写)和供应商提供的浏览器驱动程序来完成此操作。 浏览器驱动程序是独立的代理服务器,可帮助语言绑定(通过公开其内部自动化代理接口)与浏览器对话,并且以可执行二进制文件(ChromeDriver,GeckoDriver,IEDriver,EdgeDriver)的形式提供。 由于浏览器没有内置的服务器来运行命令,因此与浏览器进行通信需要浏览器驱动程序。

硒定制功能的作用

Selenium WebDriver具有带有“ REST”类API的特定于语言的库。 这些API具有一组命令,并以JSON格式进行通信。 用通俗易懂的术语来说,JSON(“ JavaScript对象表示法”的缩写)是一种用于传输/存储数据的数据格式。 语言绑定通过在传输层上发送HTTP请求(作为JSON有效负载)来使用这些API,每个请求均带有方法和模板。 创建会话(具有会话ID)以通过浏览器驱动程序与不同的浏览器对话,并接收HTTP响应。 用于传输数据的协议是平台和语言无关的“ WebDriver W3C”协议。

“功能”是一组键值对(编码为JSON格式),它们作为请求发送,以配置驱动程序实例以及为每个会话设置/控制浏览器属性和首选项。 我们使用自定义功能来定义浏览器在运行测试时要满足的功能。 它们帮助我们设置测试前提条件(要求和环境),以使用操作系统,浏览器配置,浏览器版本等的各种组合执行自动检查。

为什么我们需要自定义功能来测试Web应用程序?

测试Web应用程序并不像看起来那样简单。 当我们开始测试一个产品时,我们会努力以最好的方式对其进行测试,以便通过各种设备向最终用户提供高质量的产品。 我们借助知识,思想,经验,协作,规范,想法,工具,技术和技巧来对其进行测试。

但是Web应用程序测试带来了一系列自身的挑战,涉及安全性,性能,可用性,互操作性,请求/响应,可访问性,浏览器呈现等。 我们希望使用自动检查进行测试的每个规范都应该能够按照我们的要求在某些特定条件下执行。 它们可以是特定的环境(Web浏览器,移动设备,移动浏览器,模拟器,模拟器),特定的平台(Windows,Linux,macOS)或特定的浏览器设置(隐身,最大化,无头)。 自定义功能可帮助我们从测试自动化代码中无缝实现这些目标。

让我们讨论一下流行的Selenium自定义功能,这些功能使我们在测试Web应用程序时的测试人员的生活更加轻松,并了解如何自动从中生成有用的HTML测试报告。 10种Selenium自定义功能可简化Web测试

平台名称

浏览器名称和浏览器版本

代理

无头模式

加载扩展和禁用扩展

无痕模式

设定视窗大小

设置默认文件下载位置

处理证书

使用自定义浏览器用户配置文件

使用TestProject OpenSDK的Selenium自定义功能

Java OpenSDK代码示例

Python OpenSDK代码示例

用于Selenium自定义功能的内置HTML测试报告

结论

1)平台名称

使用WebDriver中的“ DesiredCapabilities”,我们可以设置和发送通用的标准WebDriver功能。 我们还可以使用不同的选项类(“ ChromeOptions”,“ FirefoxOptions”,“ EdgeOptions”,“ SafariOptions”,“ InternetExplorerOptions”),这些类具有设置浏览器特定功能的便捷方法。

在Java绑定中,“ setCapability()”方法可用于设置各个功能。 这样的重要功能密钥之一就是“ platformName”,它可以携带一个字符串作为其值,并以此为基础指向WebDriver实例可以在其上运行的受支持的可用平台。

值可以是“ LINUX”(表示基于Linux内核的任何服务器或台式机系统),

“ WINDOWS”(表示Microsoft Windows操作系统的任何版本,包括台式机和移动版),

“ MAC”(表示Apple macOS的任何版本)和其他一些版本。

如果计算机没有所请求的平台,则将不会创建会话,并且将引发“ SessionNotCreatedException”。

进行跨平台测试非常重要,因为最终用户可以从任何平台(或OS)访问Web应用程序,并且作为测试人员,我们必须确保应用程序在所有平台类型上均按预期的方式工作。 最终用户面临与一致性,UI,可用性和性能有关的任何问题。

2)浏览器名称和浏览器版本

对于Web浏览器,Web应用程序的行为,外观和布局可能因浏览器而异。 这是因为尽管所有浏览器都遵循开放的Web标准,但是它们使用呈现引擎以独特的方式呈现HTML和CSS。

一个好的Web应用程序在所有浏览器中应该看起来相同,并且其所有功能在所有浏览器中都应该相同。 不兼容问题不仅会出现在不同的浏览器上,还会出现在同一浏览器的不同版本上。 可能是因为较旧的浏览器版本不支持最新标准。 因此,执行自动跨浏览器测试很重要,并且可以通过传递“ browserName”和“ browserVersion”功能来实现。

3)代理

如果测试人员正在公司环境中从系统测试Web应用程序,则他/他将主要位于HTTP或SSL代理的后面,该代理由网络管理员配置以过滤或监视入站和出站Web流量。 结果,将不会建立与主机的连接,并且自动测试将失败。

在这种情况下,测试必须使用代理信息并设置代理(使用或不使用身份验证)。 在对Web应用程序进行自动本地化测试的情况下,还需要设置代理信息,其中必须针对特定区域或区域测试应用程序的行为。 要设置代理,我们可以创建一个代理对象,设置HTTP或SSL代理,并使用“代理”功能进行发送。 我们还可以关闭代理设置并通过该功能传递它。 4)无头模式

通过网络浏览器呈现时,我们会在屏幕上看到一个网络应用程序。 如果我们取消了浏览器的GUI部分并以非图形方式启动它,则该应用程序将在我们称为“无头浏览器”的环境中运行。

使用无头浏览器来测试Web应用程序的优势在于,它们可以完成普通浏览器的所有工作,但是速度和性能有所提高。 这对于并行测试执行特别有用。

而且,测试可以在没有GUI的计算机上运行。 他们甚至可以将Web内容通过管道传输到另一个程序,并向用户提供真实的浏览器上下文,而无需花费大量的内存/速度来运行具有GUI的功能。 自动化脚本编写用于执行布局检查,数据提取,文档下载/上传,页面导航和Web交互,可以在无头模式下舒适地执行。 对于Chrome,可以通过向ChromeOptions对象发送“ –headless”参数来将WebDriver会话设置为在无头模式下运行 5)加载扩展和禁用扩展

浏览器扩展通过扩展浏览器功能并消除许多无聊而平凡的任务,使我们在测试Web应用程序时的生活更加轻松。 我们在测试Web应用程序时经常使用的一些浏览器扩展包括– Postman Interceptor,Selenium IDE,Clear Cache,SelectorsHub,Analyze Page Performance,WAVE,Talend,AdBlock,What Font,Axe等。

在运行自动化测试时,我们可能需要加载扩展(打包或解压缩)或禁用扩展。 对于Chrome,打包扩展名是带有.crx扩展名的文件,而解压缩的扩展名是包含扩展名和manifest.json文件的目录。 我们可以使用addExtensions(在Java中)/ add_extension(在Python中)函数来加载扩展,并在功能中传递“ –disable-extensions”参数以禁用已加载的扩展。 6)无痕模式

在某些情况下,当您测试Web应用程序时希望隐身(私有浏览模式)。

如果您不是以隐身方式运行,则您的浏览活动,数据,Cookie,密码,管理员历史记录和浏览历史记录可能会影响您对应用程序的测试,并且故障排除问题将变得很困难。 浏览器中的隐身模式将清除您正在测试的设备所收集的临时数据。 当您测试应用程序时,它们将阻止定向广告显示。 它们还可以阻止应用程序向您显示首选项/建议,这是您要使用默认设置测试应用程序时所必需的。 通过发送带有功能的“ –incognito”参数,我们可以强制自动化测试在浏览器隐身模式下运行。

7)设定视窗大小

如今创建的大多数Web应用程序都是基于响应式Web设计的,这意味着这些应用程序的开发使其在各种设备,窗口或屏幕尺寸下都看起来不错并且可以很好地呈现。

响应式Web应用程序将通过自动调整其大小,隐藏,放大或缩小其内容来调整不同的可见窗口大小。 为了测试这种响应式应用程序,可能需要以各种窗口屏幕尺寸运行自动测试。 当WebDriver启动会话并启动浏览器时,浏览器将以其默认设置启动。 启动后,我们可能希望通过编程方式调整浏览器窗口的大小,以检查不同Web元素的行为。 为此,我们可以在功能中传递“ –window-size”参数(及其所需的值)。

8)设置默认文件下载位置

使用浏览器的默认设置,当我们单击网页中的某个元素以下载文件时,该文件将下载到我们文件系统的默认“下载”文件夹中。 在运行自动化测试时,我们可能需要从应用程序下载文件,并将文件保存在与默认下载目录不同的特定目录中。

另外,始终建议将文件下载到一个单独的文件夹中,在此文件夹中,我们可以验证文件是否已成功下载。 它还可以帮助我们将相关的下载文件保存在同一位置。 对于Chrome,我们可以轻松地以编程方式实现此目的,方法是:创建一个HashMap,将“ download.default_directory”作为具有所需路径的键添加为值,然后将其与“ prefs”键作为值传递给“ setExperimentalOption()”方法 的ChromeOptions类。

9)处理证书

SSL(安全套接字层)证书是数据文件,该文件以数字方式绑定加密密钥,从而允许安全连接并在Web应用程序服务器和Web浏览器之间启动安全会话。

在Web应用程序上运行自动化测试时,可能会遇到SSL证书错误的情况。 这可能是由于浏览器无法与请求的证书建立安全连接。 要处理此类异常,我们可以使用传递“ –ignore-certificate-errors”作为ChromeOptions对象的参数。

10)使用自定义浏览器用户配置文件

当WebDriver启动新的Chrome会话时,ChromeDriver会为该会话创建一个临时用户配置文件。 在自动测试运行期间,我们可能想使用自定义的用户配置文件,而不是新的用户配置文件,该用户配置文件预定义了特殊设置,例如已安装的扩展名,语言环境,语言等。我们可以将“ user-data-dir”作为键传递 并将自定义配置文件路径作为其告诉Chrome使用该自定义配置文件进行测试的功能的值。 如果提供的路径不存在,Chrome会在该指定位置创建一个新的配置文件。

使用TestProject OpenSDK的Selenium自定义功能

与TestProject OpenSDK一起开发和执行Web测试时,要拥有完全托管的Selenium体验,所需要做的就是安装TestProject Agent,仅此而已! 使用纯Selenium命令和任何Selenium自定义功能,您可以:

节省下载其他Selenium驱动程序或对其进行配置的时间和精力。 一切由TestProject代理自动处理。

您可以使用任何框架或第三方工具:单元测试框架,Cucumber,SpecFlow,Junit,TestNG等。

无需将任何内容上传到TestProject Cloud或集成任何类型的报告器。

您将受益于在TestProject的报告仪表板上自动为您创建的精美的HTML测试报告,您还可以在其中下载PDF格式的报告。

以下是使用Java OpenSDK和Python OpenSDK的代码示例:

Java OpenSDK代码:

package com.seleniumCapabilities.demo;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.testproject.sdk.drivers.web.ChromeDriver;
public class CapabilitiesDemo 
{
  public static void 
main
(
String
[
]
 args
)
 throws Exception 
{
    String browserDriverPath = System.
getProperty
(
"user.dir"
)
 + File.separator + 
"drivers"
 + File.separator;
    System.
setProperty
(
"webdriver.chrome.driver"
, browserDriverPath + 
"chromedriver.exe"
)
;
    DesiredCapabilities desiredCapabilities = new 
DesiredCapabilities
(
)
;
    desiredCapabilities.
setCapability
(
CapabilityType.PLATFORM_NAME, Platform.WINDOWS
)
;
    desiredCapabilities.
setCapability
(
CapabilityType.BROWSER_NAME, 
"chrome"
)
;
    desiredCapabilities.
setCapability
(
CapabilityType.BROWSER_VERSION, 
"86.0.4240.111"
)
;
    ChromeOptions chromeOptions = new 
ChromeOptions
(
)
;
    Proxy proxy = new 
Proxy
(
)
;
    proxy.
setAutodetect
(
false
)
;
    proxy.
setHttpProxy
(
"<http_proxy-url>:<port>"
)
;
    proxy.
setSslProxy
(
"<https_proxy-url>:<port>"
)
;
    proxy.
setNoProxy
(
"<no_proxy-var>"
)
;
    chromeOptions.
setCapability
(
"proxy"
, proxy
)
;
    chromeOptions.
addArguments
(
"--headless"
)
;
    chromeOptions.
addExtensions
(
new 
File
(
"<path to your extension crx file>"
)
)
;
    chromeOptions.
addArguments
(
"--incognito"
)
;
    chromeOptions.
addArguments
(
"--window-size=500,200"
)
;
    Map<String, Object> prefs = new HashMap<String, Object>
(
)
;
    prefs.
put
(
"download.default_directory"
, 
"<path to your specific downloads folder>"
)
;
    chromeOptions.
setExperimentalOption
(
"prefs"
, prefs
)
;
    chromeOptions.
addArguments
(
"user-data-dir = <path to your custom user profile>"
)
;
    chromeOptions.
merge
(
desiredCapabilities
)
;
    ChromeDriver driver = new 
ChromeDriver
(
"<your TestProject SDK Developer Token>"
, chromeOptions
)
;
    driver.
get
(
"https://example.testproject.io/web/"
)
;
    driver.
findElement
(
By.
id
(
"name"
)
)
.
sendKeys
(
"Sam"
)
;
    driver.
findElement
(
By.
id
(
"password"
)
)
.
sendKeys
(
"12345"
)
;
    driver.
findElement
(
By.
id
(
"login"
)
)
.
click
(
)
;
    driver.
quit
(
)
;
  
}
}

Python OpenSDK Code: from src.testproject.sdk.drivers import webdriver from src.testproject.sdk.drivers.webdriver.chrome import ChromeOptions

def capabilities_test(): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--proxy-server=<http_proxy_url>:") chrome_options.add_argument("--headless") chrome_options.add_extension("") chrome_options.add_argument("--incognito") chrome_options.add_argument("--window-size=500,200") prefs = { "download.default_directory": "" } chrome_options.add_experimental_option("prefs", prefs) chrome_options.add_argument("--user-data-dir = ") desired_capabilities = chrome_options.to_capabilities() desired_capabilities = DesiredCapabilities.CHROME.copy() desired_capabilities['platform'] = "WINDOWS" desired_capabilities['version'] = "86.0.4240.111" driver = webdriver.Chrome(projectname="", token="your TestProject SDK Developer Token", desired_capabilities=desired_capabilities) driver.get("https://example.testproject.io/web/") driver.find_element_by_css_selector("#name").send_keys("Sam") driver.find_element_by_css_selector("#password").send_keys("12345") driver.find_element_by_css_selector("#login").click() driver.quit()

capabilities_test() 用于Selenium自定义功能的内置HTML测试报告

TestProject OpenSDK将生成精美的HTML测试报告,并自动为您发布在TestProject平台上,即装即用,无需其他配置(您也可以将它们下载为PDF文件)。 这是具有Selenium自定义功能的OpenSDK代码示例自动生成的报告: https://blog.testproject.io/wp-content/uploads/2020/10/TestProject_Report.png 结论

Selenium还有许多其他的自定义功能,其中一些是标准的,而某些是特定于浏览器的,您可以根据执行上下文和需要将它们用于测试。 在本文中,我列出了在测试Web应用程序时对我们有最大帮助的功能。

author

石头 磊哥 seven 随便叫

company

thoughtworks(离职了。。。。)

大家好,本人不才,目前依旧混迹于thoughtworks,做着一名看起来像全栈的QA,兴趣爱好前端,目前是thoughtworks 西安QA社区的leader,如果有兴趣分享话题,或者想加入tw,可以找我

roles

QA(营生) dev(front-end dev 兴趣爱好)

联系方式

如果想转载或者高薪挖我 请直接联系我 哈哈

wechat:

qileiwangnan

email:

qileilove@gmail.com