2

UI自動化の目的でSelenium webdriverを使用しています。以下は私のサンプルコードです

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

pagesource 変数に doctype がありません。W3C 検証用の DOCTYPE を知る必要があります。セレンを介してhtmlソースのDOCTYPEを取得する方法はありますか?

このスレッドは、selenium を介して html ソースの Doctype を取得する方法がないことを示しています。代わりに、.net から HTTP リクエストを実行して DOCTYPE を取得できます。DOCTYPE を取得するために別の HTTP リクエストを実行したくありません。

4

2 に答える 2

4

InternetExplorerDriver の代わりに FirefoxDriver を使用すると、DOCTYPE が取得されます。残念ながら、これでは問題は解決しません。driver.PageSource で取得するソースはブラウザーによって既に前処理されているため、そのコードを検証しようとしても信頼できる結果は得られません。

残念ながら、簡単な解決策はありません。

ページがパスワードで保護されていない場合は、"validate by uri" メソッドを使用できます。

それ以外の場合は、ページ ソースを取得する必要があります。私はそれを行う2つの方法を知っています(プロジェクトで両方を実装しました)。1つはプロキシを使用することです。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 ドライバーを介して 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 に答える