如何配置 PhantomJSDriver 以尽可能地模拟我的 Google Chrome 浏览器?
How do I configure PhantomJSDriver to closely emulate my Google Chrome browser as much as possible?
以下是我的开发环境的详细信息:
-Visual Studio 2012 Ultimate with Update 4
-Google Chrome 版本 40.0.2214.94 m
-Windows 7 位专业人士,32 位操作系统
我的 Google Chrome 浏览器的用户代理字符串是:
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36
我的AutomatedUI测试代码中的C#代码如下:
var options = new PhantomJSOptions();
// Chrome User Agent ( Chrome Version 40.0.2214.94 m )
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36");
driver = new OpenQA.Selenium.PhantomJS.PhantomJSDriver(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\packages\PhantomJS.1.9.8\tools\phantomjs"), options);
url = new Uri("http://localhost:2816/");
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(90.00));
wait.Until(ExpectedConditions.ElementIsClickable( By.XPath("//a[text()='Users']")));
IWebElement btn = waitArg.Until<IWebElement>((d) => {
try{
return d.FindElement( By.XPath("//a[text()='Users']") );
}
catch {
return null;
}
});
btn.Click();
不幸的是,上面的代码很难找到元素。我相信,如果我可以配置代码中使用的 PhantomJS 驱动程序以更接近地模拟我桌面上的 Google Chrome 版本 40.0.2214.94 m 浏览器,那么自动 UI 测试代码每当测试 运行 时,应该能够给出更一致和准确的测试结果。
有人可以建议我是否可以对以下代码进行一些修改,以更接近地模拟我的 Google Chrome 版本 40.0.2214.94 m 浏览器?
var options = new PhantomJSOptions();
// Chrome User Agent ( Chrome Version 40.0.2214.94 m )
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36");
driver = new OpenQA.Selenium.PhantomJS.PhantomJSDriver(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\packages\PhantomJS.1.9.8\tools\phantomjs"), options);
在@artjom-b的帮助下更新答案
var options = new PhantomJSOptions();
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36");
var service = PhantomJSDriverService.CreateDefaultService(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\packages\PhantomJS.1.9.8\tools\phantomjs"));
service.SslProtocol = "any";
driver = new PhantomJSDriver(service, options);
url = new Uri("http://localhost:2816/");
// 1280, height: 1024
// @artjom-b strongly recommened that the Driver's Window Size be quite large. Let's set the Window Size to quite large.
driver.Manage().Window.Size = new System.Drawing.Size(1280, 1024); // Size is a type in assembly "System.Drawing"
PhantomJS 是一个独立的(无头)浏览器。您无法配置它,使其表现得像 Chrome。当涉及到渲染引擎时,根本没有什么可配置的。您可以做一些事情,让 PhantomJS 像桌面浏览器一样运行。
第一件事是将视口大小设置为大一些。 PhantomJS 运行 默认情况下,视口为 400x300。视口为固定宽度的网站扩展,但为响应式网站保持小。根据网站的编写方式,某些元素可能会被隐藏并且无法点击。
参见:Setting screen size in PhantomJS C# being driven by Selenium
要做的第二件事是将用户代理字符串设置为最接近其功能的内容。 PhantomJS 1.x 基于 QtWebKit 的旧分支。 Chrome据说13最配了
为什么这有关系?有些网站在遇到新的用户代理时会使用一些 "experimental" JavaScript。使用 old/matching 用户代理字符串,这样执行此操作的网站就不会发送奇怪的 JavaScript 或其他 PhantomJS 无法理解的奇怪内容。 Google does/did 例如这个。
用户代理字符串:
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1
PhantomJS 1.x 默认使用 SSLv3,如果服务器不支持它(因为 POODLE 漏洞),连接将失败。使用 any
以便 PhantomJS 接受它理解的所有 SSL/TLS 连接。
参见:A: Selenium Webdriver + PhantomJS remains at about:blank for a specific site
PhantomJS 1.x 不支持 Function.prototype.bind
等等。 C# 的 selenium 语言绑定支持通过 PhantomJSDriver.ExecutePhantomJS()
执行 PhantomJS 脚本片段(不是页面脚本),这使得 运行 一个填充程序可以用一些必要的功能改造 PhantomJS。相关 commit as provided in the .
有些事情你真的无能为力:
- 点击下载 link 不会下载任何内容。 PhantomJS 不会触发下载(使用 XHR 手动下载的最长持续时间为 30 秒)。
- 无法打开 PDF。
以下是我的开发环境的详细信息:
-Visual Studio 2012 Ultimate with Update 4
-Google Chrome 版本 40.0.2214.94 m
-Windows 7 位专业人士,32 位操作系统
我的 Google Chrome 浏览器的用户代理字符串是:
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36
我的AutomatedUI测试代码中的C#代码如下:
var options = new PhantomJSOptions();
// Chrome User Agent ( Chrome Version 40.0.2214.94 m )
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36");
driver = new OpenQA.Selenium.PhantomJS.PhantomJSDriver(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\packages\PhantomJS.1.9.8\tools\phantomjs"), options);
url = new Uri("http://localhost:2816/");
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(90.00));
wait.Until(ExpectedConditions.ElementIsClickable( By.XPath("//a[text()='Users']")));
IWebElement btn = waitArg.Until<IWebElement>((d) => {
try{
return d.FindElement( By.XPath("//a[text()='Users']") );
}
catch {
return null;
}
});
btn.Click();
不幸的是,上面的代码很难找到元素。我相信,如果我可以配置代码中使用的 PhantomJS 驱动程序以更接近地模拟我桌面上的 Google Chrome 版本 40.0.2214.94 m 浏览器,那么自动 UI 测试代码每当测试 运行 时,应该能够给出更一致和准确的测试结果。
有人可以建议我是否可以对以下代码进行一些修改,以更接近地模拟我的 Google Chrome 版本 40.0.2214.94 m 浏览器?
var options = new PhantomJSOptions();
// Chrome User Agent ( Chrome Version 40.0.2214.94 m )
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36");
driver = new OpenQA.Selenium.PhantomJS.PhantomJSDriver(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\packages\PhantomJS.1.9.8\tools\phantomjs"), options);
在@artjom-b的帮助下更新答案
var options = new PhantomJSOptions();
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36");
var service = PhantomJSDriverService.CreateDefaultService(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\packages\PhantomJS.1.9.8\tools\phantomjs"));
service.SslProtocol = "any";
driver = new PhantomJSDriver(service, options);
url = new Uri("http://localhost:2816/");
// 1280, height: 1024
// @artjom-b strongly recommened that the Driver's Window Size be quite large. Let's set the Window Size to quite large.
driver.Manage().Window.Size = new System.Drawing.Size(1280, 1024); // Size is a type in assembly "System.Drawing"
PhantomJS 是一个独立的(无头)浏览器。您无法配置它,使其表现得像 Chrome。当涉及到渲染引擎时,根本没有什么可配置的。您可以做一些事情,让 PhantomJS 像桌面浏览器一样运行。
第一件事是将视口大小设置为大一些。 PhantomJS 运行 默认情况下,视口为 400x300。视口为固定宽度的网站扩展,但为响应式网站保持小。根据网站的编写方式,某些元素可能会被隐藏并且无法点击。
参见:Setting screen size in PhantomJS C# being driven by Selenium
要做的第二件事是将用户代理字符串设置为最接近其功能的内容。 PhantomJS 1.x 基于 QtWebKit 的旧分支。 Chrome据说13最配了
为什么这有关系?有些网站在遇到新的用户代理时会使用一些 "experimental" JavaScript。使用 old/matching 用户代理字符串,这样执行此操作的网站就不会发送奇怪的 JavaScript 或其他 PhantomJS 无法理解的奇怪内容。 Google does/did 例如这个。
用户代理字符串:
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1
PhantomJS 1.x 默认使用 SSLv3,如果服务器不支持它(因为 POODLE 漏洞),连接将失败。使用 any
以便 PhantomJS 接受它理解的所有 SSL/TLS 连接。
参见:A: Selenium Webdriver + PhantomJS remains at about:blank for a specific site
PhantomJS 1.x 不支持 Function.prototype.bind
等等。 C# 的 selenium 语言绑定支持通过 PhantomJSDriver.ExecutePhantomJS()
执行 PhantomJS 脚本片段(不是页面脚本),这使得 运行 一个填充程序可以用一些必要的功能改造 PhantomJS。相关 commit as provided in the
有些事情你真的无能为力:
- 点击下载 link 不会下载任何内容。 PhantomJS 不会触发下载(使用 XHR 手动下载的最长持续时间为 30 秒)。
- 无法打开 PDF。