Dapatkan Sumber HTML WebElement di Selenium WebDriver menggunakan Python

476

Saya menggunakan binding Python untuk menjalankan Selenium WebDriver:

from selenium import webdriver
wd = webdriver.Firefox()

Saya tahu saya bisa mengambil elemen web seperti ini:

elem = wd.find_element_by_css_selector('#my-id')

Dan saya tahu saya bisa mendapatkan sumber halaman penuh dengan ...

wd.page_source

Tetapi apakah ada cara untuk mendapatkan "sumber elemen"?

elem.source   # <-- returns the HTML as a string

Dokumen web selenium untuk Python pada dasarnya tidak ada dan saya tidak melihat apa pun dalam kode yang tampaknya mengaktifkan fungsi itu.

Adakah pemikiran tentang cara terbaik untuk mengakses HTML suatu elemen (dan anak-anaknya)?

Chris W.
sumber
8
Anda juga bisa memilah semuanya wd.page_sourcedengan beautifulsoup
eLRuLL

Jawaban:

748

Anda bisa membaca innerHTMLatribut untuk mendapatkan sumber konten elemen atau outerHTMLuntuk sumber dengan elemen saat ini.

Python:

element.get_attribute('innerHTML')

Jawa:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Rubi:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Diuji dan bekerja dengan ChromeDriver.

Nerijus
sumber
9
innerHTML adalah atribut bukan DOM. Jadi jawaban di atas tidak akan berhasil. innerHTML adalah nilai javascript javascript. Melakukan di atas akan mengembalikan nol. Jawaban oleh nilesh adalah jawaban yang tepat.
bibstha
6
Ini bekerja baik untuk saya, dan jauh lebih elegan daripada jawaban yang diterima. Saya menggunakan Selenium 2.24.1.
Ryan Shillington
22
Meskipun innerHTML bukan atribut DOM, itu didukung dengan baik oleh semua browser utama ( quirksmode.org/dom/w3c_html.html ). Ini juga bekerja dengan baik untuk saya.
CuongHuyTo
3
+1 Ini juga berfungsi di ruby. Saya merasa bahwa getAttributemetode (atau setara dalam bahasa lain) hanya memanggil metode js yang namanya arg. Namun dokumentasi tidak secara eksplisit mengatakan ini, jadi solusi nilesh harus menjadi mundur.
Kelvin
23
Ini gagal untuk HtmlUnitDriver. Bekerja untuk ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) dan PhantomJSDriver(saya belum diuji orang lain).
acdcjunior
91

Sebenarnya tidak ada cara mudah untuk mendapatkan kode sumber html a webelement. Anda harus menggunakan JS. Saya tidak terlalu yakin tentang binding python tetapi Anda dapat dengan mudah melakukan ini di Jawa. Saya yakin pasti ada sesuatu yang mirip dengan JavascriptExecutorkelas di Python.

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 
nilesh
sumber
1
Ini pada dasarnya adalah apa yang akhirnya saya lakukan, meskipun dengan persamaan Python.
Chris W.
8
Saya pikir jawabannya di bawah ini, menggunakan element.getAttribute ("innerHTML") jauh lebih mudah dibaca. Saya tidak mengerti mengapa orang memilihnya.
Ryan Shillington
1
Tidak perlu memanggil javascript sama sekali. Dalam Python cukup gunakan element.get_attribute ('innerHTML')
Anthon
6
@Anthon innerHTMLbukan atribut DOM. Ketika saya menjawab pertanyaan ini pada tahun 2011, itu tidak berfungsi untuk saya, sepertinya sekarang beberapa browser mendukungnya. Jika itu bekerja untuk Anda maka menggunakan innerHTMLlebih bersih. Namun tidak ada jaminan ini akan berfungsi pada semua browser.
nilesh
2
Rupanya, ini adalah satu-satunya cara untuk mendapatkan innerHTML saat menggunakan RemoteWebDriver
Illidan
73

Tentu kita bisa mendapatkan semua kode sumber HTML dengan skrip di bawah ini di Selenium Python:

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

Jika Anda ingin menyimpannya ke file:

with open('c:/html_source_code.html', 'w') as f:
    f.write(source_code.encode('utf-8'))

Saya sarankan menyimpan ke file karena kode sumber sangat panjang.

Menandai
sumber
2
Bisakah saya mengatur penundaan dan mendapatkan sumber terbaru? Ada konten dinamis yang dimuat menggunakan javascript.
CodeGuru
Apakah ini berfungsi bahkan jika halaman tidak dimuat sepenuhnya? Juga, apakah ada cara untuk mengatur penundaan seperti yang disebutkan @FlyingAtom?
TheRookierLearner
13

Di Ruby, menggunakan selenium-webdriver (2.32.1), ada page_sourcemetode yang berisi seluruh sumber halaman.

John Alberts
sumber
5

Menggunakan metode atribut, pada kenyataannya, lebih mudah dan lebih lurus ke depan.

Menggunakan Ruby dengan permata Selenium dan PageObject, untuk mendapatkan kelas yang terkait dengan elemen tertentu, garis itu akan menjadi element.attribute(Class).

Konsep yang sama berlaku jika Anda ingin membuat atribut lain terikat ke elemen. Misalnya, jika saya ingin String elemen element.attribute(String),.

Tiffany G
sumber
4

Terlihat usang, tetapi tetap ada di sini. Cara yang benar untuk melakukannya dalam kasus Anda:

elem = wd.find_element_by_css_selector('#my-id')
html = wd.execute_script("return arguments[0].innerHTML;", elem)

atau

html = elem.get_attribute('innerHTML')

Keduanya bekerja untuk saya (selenium-server-standalone-2.35.0)

nefski
sumber
3

Java dengan Selenium 2.53.0

driver.getPageSource();
WltrRpo
sumber
bukan itu pertanyaannya
Corey Goldberg
Bergantung pada driver web, getPageSourcemetode ini mungkin tidak mengembalikan sumber halaman yang sebenarnya (yaitu dengan kemungkinan perubahan javascript). Sumber yang dikembalikan mungkin sumber baku yang dikirim oleh server. Doc webdriver harus diperiksa untuk memastikan hal ini.
Stephan
2

Saya harap ini bisa membantu: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Berikut ini dijelaskan metode Java:

java.lang.String    getText() 

Namun sayangnya itu tidak tersedia dalam Python. Jadi Anda dapat menerjemahkan nama metode ke Python dari Jawa dan mencoba logika lain menggunakan metode ini tanpa mendapatkan sumber seluruh halaman ...

Misalnya

 my_id = elem[0].get_attribute('my-id')
oleksii.burdin
sumber
6
Python sebenarnya memiliki padanan "gettext" (saya pikir itu hanya atribut "text"?) Tetapi itu sebenarnya hanya mengembalikan "plaintext" antara tag HTML dan tidak akan benar-benar mengembalikan sumber HTML lengkap.
Chris W.
2
Ini hanya mengembalikan teks biasa (bukan html) di Jawa juga.
Ryan Shillington
Anda harus
merujuknya
2

Ini bekerja dengan mulus untuk saya.

element.get_attribute('innerHTML')
Jitendra Pisal
sumber
1

InnerHTML akan mengembalikan elemen di dalam elemen yang dipilih dan outerHTML akan kembali ke dalam HTML bersama dengan elemen yang telah Anda pilih

Contoh: - Sekarang anggap Elemen Anda adalah seperti di bawah ini

<tr id="myRow"><td>A</td><td>B</td></tr>

Output elemen innerHTML

<td>A</td><td>B</td>

Output elemen outerHTML

<tr id="myRow"><td>A</td><td>B</td></tr>

Contoh Langsung: -

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

Di bawah ini Anda akan menemukan sintaksis yang memerlukan sesuai pengikatan berbeda. Ubah innerHTMLke outerHTMLsesuai yang diperlukan.

Python:

element.get_attribute('innerHTML')

Jawa:

elem.getAttribute("innerHTML");

Jika Anda ingin seluruh halaman HTML gunakan kode di bawah ini: -

driver.getPageSource();
Shubham Jain
sumber
0
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return      arguments[0].innerHTML;", element); 

Kode ini juga berfungsi untuk mendapatkan JavaScript dari sumber!

Ilya
sumber
0

Dan dalam tes selenium PHPUnit seperti ini:

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

Jika Anda tertarik pada solusi untuk Remote Control dengan Python, berikut ini cara mendapatkan innerHTML:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
StanleyD
sumber
Terima kasih atas bantuannya, saya telah menggunakan ini. Saya juga menemukan innerHTML = {solenium selector code}.textkarya yang sama.
Shane
0

Metode untuk mendapatkan terjemahan HTML yang saya sukai adalah sebagai berikut:

driver.get("http://www.google.com")
body_html = driver.find_element_by_xpath("/html/body")
print body_html.text

Namun metode di atas menghapus semua tag (ya tag bersarang juga) dan hanya mengembalikan konten teks. Jika Anda tertarik untuk mendapatkan markup HTML juga, maka gunakan metode di bawah ini.

print body_html.getAttribute("innerHTML")
Berkarat
sumber
1
Anda juga dapat menggunakan driver.find_element_by_tag ("body") untuk mencapai konten isi halaman.
Rusty