在自动化测试领域,WebDriver 是一个非常强大的工具。它允许开发者编写脚本来模拟用户在浏览器中的操作。本文将介绍一些高级的 WebDriver 使用技巧,帮助更有效地进行自动化测试。
通过使用 FirefoxProfile 类的 AddExtension 方法,可以加载所需的插件。以下是在 C# 中实现的示例代码:
FirefoxProfile profile = new FirefoxProfile();
profile.AddExtension(@"C:\extensionsLocation\extension.xpi");
IWebDriver driver = new FirefoxDriver(profile);
这样,就可以在 Firefox 浏览器中启动WebDriver并加载指定的扩展插件。
与 FirefoxDriver 不同,ChromeDriver 设置代理需要使用 Proxy 类和 ChromeOptions 类。以下是 C# 中的示例代码:
ChromeOptions options = new ChromeOptions();
var proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.HttpProxy = proxy.SslProxy = "127.0.0.1:3239";
options.Proxy = proxy;
options.AddArgument("ignore-certificate-errors");
IWebDriver driver = new ChromeDriver(options);
通过这种方式,可以为 ChromeDriver 设置一个手动代理,以便在测试过程中控制网络请求。
与上一个示例相比,这里的区别在于配置了 --proxy-server 参数。以下是 C# 中的示例代码:
ChromeOptions options = new ChromeOptions();
var proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.HttpProxy = proxy.SslProxy = "127.0.0.1:3239";
options.Proxy = proxy;
options.AddArguments("--proxy-server=http://user:password@127.0.0.1:3239");
options.AddArgument("ignore-certificate-errors");
IWebDriver driver = new ChromeDriver(options);
这样,就可以在 ChromeDriver 中设置一个需要认证的代理服务器。
Chrome 扩展可以是打包的也可以是未打包的。未打包的扩展是一个包含扩展文件的目录,包括一个 manifest.json 文件。要加载未打包的扩展,需要设置 load-extension 参数。以下是 C# 中的示例代码:
ChromeOptions options = new ChromeOptions();
options.AddArguments("load-extension=/pathTo/extension");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.SetCapability(ChromeOptions.Capability, options);
DesiredCapabilities dc = DesiredCapabilities.Chrome();
dc.SetCapability(ChromeOptions.Capability, options);
IWebDriver driver = new RemoteWebDriver(dc);
通过这种方式,可以在 ChromeDriver 中加载一个未打包的扩展。
与设置 load-extension 参数不同,这里需要使用 ChromeOptions 类的 AddExtension 方法来设置打包扩展的路径。以下是 C# 中的示例代码:
ChromeOptions options = new ChromeOptions();
options.AddExtension(Path.GetFullPath("local/path/to/extension.crx"));
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.SetCapability(ChromeOptions.Capability, options);
DesiredCapabilities dc = DesiredCapabilities.Chrome();
dc.SetCapability(ChromeOptions.Capability, options);
IWebDriver driver = new RemoteWebDriver(dc);
这样,就可以在 ChromeDriver 中加载一个打包的扩展。
可以通过 IWebElement 接口的 Enabled 属性来检查一个元素是否被禁用。以下是 C# 中的示例代码:
[TestMethod]
public void AssertButtonEnabledDisabled()
{
this.driver.Navigate().GoToUrl(@"http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_button_disabled");
this.driver.SwitchTo().Frame("iframeResult");
IWebElement button = driver.FindElement(By.XPath("/html/body/button"));
Assert.IsFalse(button.Enabled);
}
通过这种方式,可以在测试中断言按钮是否处于启用或禁用状态。
可以通过 IWebElement 接口的 GetAttribute 方法来获取隐藏字段的值。以下是 C# 中的示例代码:
[TestMethod]
public void AssertButtonEnabledDisabled()
{
this.driver.Navigate().GoToUrl(@"http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_button_disabled");
this.driver.SwitchTo().Frame("iframeResult");
IWebElement button = driver.FindElement(By.XPath("/html/body/button"));
Assert.IsFalse(button.Enabled);
}
通过这种方式,可以在测试中设置和断言隐藏字段的值。
jQuery.active 是 jQuery 内部用来跟踪同时进行的 AJAX 请求数量的变量。需要等待 jQuery.active 的值为零,然后继续执行下一步操作。以下是 C# 中的示例代码:
public void WaitForAjaxComplete(int maxSeconds)
{
bool isAjaxCallComplete = false;
for (int i = 1; i <= maxSeconds; i++)
{
isAjaxCallComplete = (bool)((IJavaScriptExecutor)driver).ExecuteScript("return window.jQuery != undefined && jQuery.active == 0");
if (isAjaxCallComplete)
{
return;
}
Thread.Sleep(1000);
}
throw new Exception(string.Format("Timed out after {0} seconds", maxSeconds));
}
通过这种方式,可以在测试中等待 AJAX 调用完成。
要改变当前 Chrome 实例的默认下载目录,需要设置 download.default_directory 参数。以下是 C# 中的示例代码:
[TestMethod]
public void VerifyFileDownloadChrome()
{
string expectedFilePath = @"c:\temp\Testing_Framework_2015_3_1314_2_Free.exe";
try
{
String downloadFolderPath = @"c:\temp\";
var options = new ChromeOptions();
options.AddUserProfilePreference("download.default_directory", downloadFolderPath);
driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://www.telerik.com/download-trial-file/v2/telerik-testing-framework");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until((x) => { return File.Exists(expectedFilePath); });
FileInfo fileInfo = new FileInfo(expectedFilePath);
long fileSize = fileInfo.Length;
Assert.AreEqual(4326192, fileSize);
}
finally
{
if (File.Exists(expectedFilePath))
{
File.Delete(expectedFilePath);
}
}
}
通过这种方式,可以在测试中验证 ChromeDriver 下载的文件。
对于 FirefoxDriver,需要设置一些参数,以便浏览器不会每次都询问保存指定文件的位置。以下是 C# 中的示例代码:
[TestMethod]
public void VerifyFileDownloadFirefox()
{
string expectedFilePath = @"c:\temp\Testing_Framework_2015_3_1314_2_Free.exe";
try
{
String downloadFolderPath = @"c:\temp\";
FirefoxProfile profile = new FirefoxProfile();
profile.SetPreference("browser.download.folderList", 2);
profile.SetPreference("browser.download.dir", downloadFolderPath);
profile.SetPreference("browser.download.manager.alertOnEXEOpen", false);
profile.SetPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/binary, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
this.driver = new FirefoxDriver(profile);
driver.Navigate().GoToUrl("https://www.telerik.com/download-trial-file/v2/telerik-testing-framework");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until((x) => { return File.Exists(expectedFilePath); });
FileInfo fileInfo = new FileInfo(expectedFilePath);
long fileSize = fileInfo.Length;
Assert.AreEqual(4326192, fileSize);
}
finally
{
if (File.Exists(expectedFilePath))
{
File.Delete(expectedFilePath);
}
}
}