Pythonを使用してSelenium WebDriverでWebElementのHTMLソースを取得する
私はSelenium WebDriverを実行するためにPythonバインディングを使用しています。
from Selenium import webdriver
wd = webdriver.Firefox()
私は私がそうのようにwebelementをつかむことができることを知っています...
elem = wd.find_element_by_css_selector('#my-id')
そして、私はフルページのソースを入手できることを知っています...
wd.page_source
しかし、「要素のソース」を入手する方法はありますか。
elem.source # <-- returns the HTML as a string
Python用のSelenium Webドライバ文書は基本的には存在しないため、その機能を有効にするように思われるものはコードにはありません。
要素(およびその子)のHTMLにアクセスするための最良の方法について何か考えますか?
innerHTML
属性を読んで、要素のcontentのソースを取得するか、source withの現在の要素のouterHTML
を取得することができます。
Python:
element.get_attribute('innerHTML')
Java:
elem.getAttribute("innerHTML");
C#:
element.GetAttribute("innerHTML");
ルビー:
element.attribute("innerHTML")
JS:
element.getAttribute('innerHTML');
PHP:
$elem.getAttribute('innerHTML');
テスト済みで、ChromeDriver
で動作します。
WebelementのHTMLソースコードを取得するための簡単な方法は実際にはありません。あなたはJSを使わなければならないでしょう。私はpythonバインディングについてはあまりよくわかりませんが、Javaではこのように簡単に行うことができます。私はPythonのJavascriptExecutor
クラスに似たものがあるはずです。
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
以下のSelenium Pythonで、このスクリプトを使用してすべてのHTMLソースコードを入手できます。
elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")
ファイルに保存したい場合は、
f = open('c:/html_source_code.html', 'w')
f.write(source_code.encode('utf-8'))
f.close()
ソースコードは非常に長いので、ファイルに保存することをお勧めします。
Rubyでは、Selenium-webdriver(2.32.1)を使用して、ページソース全体を含むpage_source
メソッドがあります。
時代遅れに見えますが、とにかくここにしましょう。あなたのケースでそれを行うための正しい方法:
elem = wd.find_element_by_css_selector('#my-id')
html = wd.execute_script("return arguments[0].innerHTML;", elem)
または
html = elem.get_attribute('innerHTML')
両方とも私のために働いています(Selenium-server-standalone-2.35.0)
属性メソッドを使用することは、実際、より簡単で、より直接的です。
Selenium gemとPageObject gemでRubyを使用して、特定の要素に関連付けられたクラスを取得するための行はelement.attribute(Class)
になります。
他の属性を要素に関連付けたい場合も、同じ概念が適用されます。たとえば、要素の文字列が必要な場合はelement.attribute(String)
です。
私はこれが役立つことを願っています: http://Selenium.googlecode.com/svn/trunk/docs/api/Java/org/openqa/Selenium/WebElement.html
ここではJavaメソッドについて説明します。
Java.lang.String getText()
しかし残念ながら、Pythonでは利用できません。そのため、ページソース全体を取得せずに、メソッド名をJavaからPythonに変換し、現在のメソッドを使用して別のロジックを試すことができます。
例えば。
my_id = elem[0].get_attribute('my-id')
Selenium 2.53.0を使用したJava
driver.getPageSource();
InnerHTMLは選択された要素の内側の要素を返し、outerHTMLはあなたが選択した要素と共にHTMLの内側を返します
例: - 今、あなたの要素は以下のようになっているとします
<tr id="myRow"><td>A</td><td>B</td></tr>
innerHTML要素出力
<td>A</td><td>B</td>
outerHTMLエレメント出力
<tr id="myRow"><td>A</td><td>B</td></tr>
ライブ例: -
以下にあなたは異なる束縛に従って必要とする構文を見つけるでしょう。必要に応じてinnerHTML
をouterHTML
に変更します。
Python:
element.get_attribute('innerHTML')
Java:
elem.getAttribute("innerHTML");
あなたが全ページHTMLを使用したい場合は、以下のコードを使用してください -
driver.getPageSource();
あなたがPythonのリモートコントロールのための解決策に興味があるなら、以下はinnerHTMLを取得する方法です:
innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
このコードは、ソースからJavaScriptを取得するのにも役立ちます!
私が好むレンダリングされたHTMLを取得する方法は以下の通りです:
driver.get("http://www.google.com")
body_html = driver.find_element_by_xpath("/html/body")
print body_html.text
ただし、上記の方法ではすべてのタグが削除され(ネストされたタグも同様)、テキストコンテンツのみが返されます。 HTMLマークアップも取得したい場合は、以下の方法を使用してください。
print body_html.getAttribute("innerHTML")
そしてPHPUnit Seleniumテストでは次のようになります。
$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');