2

我将 Selenium webdriver 用于 UI 自动化目的。下面是我的示例代码

IWebDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver();
    string url ="http://stackoverflow.com";
    driver.Navigate().GoToUrl(url);
    string pagesource = driver.PageSource;

pagesource 变量没有文档类型。我需要知道用于W3C 验证的 DOCTYPE 。有什么方法可以通过 selenium 获取 html 源的 DOCTYPE 吗?

该线程显示无法通过 selenium 获取 html 源的 Doctype,而是您可以从 .net 发出 HTTP 请求并获取 DOCTYPE。我不想为获取 DOCTYPE 做一个单独的 HTTP 请求。

4

2 回答 2

4

使用 FirefoxDriver 而不是 InternetExplorerDriver 将为您提供 DOCTYPE。不幸的是,这不能解决您的问题 - 您使用 driver.PageSource 获得的源代码已经被浏览器预处理,因此尝试验证该代码不会给出可靠的结果。

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

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

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

于 2012-05-22T09:52:28.677 回答
1

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

  1. 由于 driver.Pagesource 不可靠,因此获取正确的页面源。
  2. 获取 HTML 源的 doctype。
  3. 处理通过 ajax 调用呈现的控件。由于我们无法在页面源中访问这些控件,我们如何获得页面的确切“生成源”?

上述所有事情都可以通过 selenium web driver 执行 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 ;

现在使用 doctype 访问完整的 AJAX 呈现的 HTML 源的 C# 代码


 IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
            string jsToexecute =File.ReadAlltext("htmlsource.txt");
            string completeHTMLGeneratedSourceWithDoctype = (string)js.ExecuteScript(jsToexecute);
于 2012-05-24T14:33:31.937 回答