使用 selenium webdriver C# 获取 DOCTYPE
本文关键字:获取 DOCTYPE webdriver selenium 使用 | 更新日期: 2023-09-27 18:35:00
我正在使用Selenium网络驱动程序进行UI自动化。下面是我的示例代码
IWebDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver();
string url ="http://stackoverflow.com";
driver.Navigate().GoToUrl(url);
string pagesource = driver.PageSource;
页面源变量没有文档类型。我需要知道 W3C 验证的 DOCTYPE。有没有办法通过硒获取html源代码的DOCTYPE?
这个线程表明没有办法通过硒获取html源代码的Doctype,相反,你可以从.net做一个HTTP请求并获取DOCTYPE。我不想为获取 DOCTYPE 做单独的 HTTP 请求。
使用 FirefoxDriver 而不是 InternetExplorerDriver 将获得 DOCTYPE。不幸的是,这不会解决您的问题 - 您使用驱动程序获得的来源。PageSource 已由浏览器预处理,因此尝试验证代码不会给出可靠的结果。
不幸的是,没有简单的解决方案。
如果您的页面没有密码保护,您可以使用"通过 uri 验证"方法。
否则,您需要获取页面源代码。我知道两种方法(我在我的项目中都实现了这两种方法(。一是使用代理。如果您使用的是 C#,请查看 FiddlerCore。另一种方法是使用 javascript 和 XMLHttpRequest 发出另一个请求。你可以在这里找到示例(在页面中搜索XMLHttpRequest(。
对于 W3C 验证,如果我们通过 selenium webdriver 自动化,基本上我们有 3 个问题。
- 自驱动程序以来获取正确的页面源。页面源不可靠。
- 获取 HTML 源代码的文档类型。
- 处理通过 ajax 调用呈现的控件。由于我们无法在页面源代码中访问这些控件,我们如何获得页面的确切"生成源代码"?
以上所有事情都可以通过Selenium Web驱动程序执行javascript来完成。
在名为"HTMLsource.txt的文本文件中,存储下面的代码片段。
function outerHTML(node){
// if IE, Chrome take the internal method otherwise build one as lower versions of firefox
//does not support element.outerHTML property
return node.outerHTML || (
function(n){
var div = document.createElement('div'), h;
div.appendChild( n.cloneNode(true) );
h = div.innerHTML;
div = null;
return h;
})(node);
}
var outerhtml = outerHTML(document.getElementsByTagName('html')[0]);
var node = document.doctype;
var doctypestring="";
if(node)
{
// IE8 and below does not have document.doctype and you will get null if you access it.
doctypestring = "<!DOCTYPE "
+ node.name
+ (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '')
+ (!node.publicId && node.systemId ? ' SYSTEM' : '')
+ (node.systemId ? ' "' + node.systemId + '"' : '')
+ '>';
}
else
{
// for IE8 and below you can access doctype like this
doctypestring = document.all[0].text;
}
return doctypestring +outerhtml ;
现在,C#代码可以使用doctype访问完整的AJAX渲染的HTML源代码
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string jsToexecute =File.ReadAlltext("htmlsource.txt");
string completeHTMLGeneratedSourceWithDoctype = (string)js.ExecuteScript(jsToexecute);