使用 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 请求。

使用 selenium webdriver C# 获取 DOCTYPE

使用 FirefoxDriver 而不是 InternetExplorerDriver 将获得 DOCTYPE。不幸的是,这不会解决您的问题 - 您使用驱动程序获得的来源。PageSource 已由浏览器预处理,因此尝试验证代码不会给出可靠的结果。

不幸的是,没有简单的解决方案。

如果您的页面没有密码保护,您可以使用"通过 uri 验证"方法。

否则,您需要获取页面源代码。我知道两种方法(我在我的项目中都实现了这两种方法(。一是使用代理。如果您使用的是 C#,请查看 FiddlerCore。另一种方法是使用 javascript 和 XMLHttpRequest 发出另一个请求。你可以在这里找到示例(在页面中搜索XMLHttpRequest(。

对于 W3C 验证,如果我们通过 selenium webdriver 自动化,基本上我们有 3 个问题。

  1. 自驱动程序以来获取正确的页面源。页面源不可靠。
  2. 获取 HTML 源代码的文档类型。
  3. 处理通过 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);