web-dev-qa-db-ja.com

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にアクセスするための最良の方法について何か考えますか?

386
Chris W.

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で動作します。

620
Nerijus

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); 
85
nilesh

以下の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()

ソースコードは非常に長いので、ファイルに保存することをお勧めします。

62
Mark

Rubyでは、Selenium-webdriver(2.32.1)を使用して、ページソース全体を含むpage_sourceメソッドがあります。

11
John Alberts

時代遅れに見えますが、とにかくここにしましょう。あなたのケースでそれを行うための正しい方法:

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)

4
nefski

属性メソッドを使用することは、実際、より簡単で、より直接的です。

Selenium gemとPageObject gemでRubyを使用して、特定の要素に関連付けられたクラスを取得するための行はelement.attribute(Class)になります。

他の属性を要素に関連付けたい場合も、同じ概念が適用されます。たとえば、要素の文字列が必要な場合はelement.attribute(String)です。

4
Tiffany G

私はこれが役立つことを願っています: 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')
2
oleksii.burdin

Selenium 2.53.0を使用したJava

driver.getPageSource();
1
WltrRpo

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>

ライブ例: -

http://www.Java2s.com/Tutorials/JavascriptDemo/f/find_out_the_difference_between_innerhtml_and_outerhtml_in_javascript_example.htm

以下にあなたは異なる束縛に従って必要とする構文を見つけるでしょう。必要に応じてinnerHTMLouterHTMLに変更します。

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

あなたが全ページHTMLを使用したい場合は、以下のコードを使用してください -

driver.getPageSource();
0
Shubham Jain

あなたがPythonのリモートコントロールのための解決策に興味があるなら、以下はinnerHTMLを取得する方法です:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
0
StanleyD
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return      arguments[0].innerHTML;", element); 

このコードは、ソースからJavaScriptを取得するのにも役立ちます!

0
Ilya

私が好むレンダリングされた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")
0
Rusty

そしてPHPUnit Seleniumテストでは次のようになります。

$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');
0
Zorgijs