Python kullanarak Selenium WebDriver'da WebElement'in HTML Kaynağını edinin


476

Selenium WebDriver'ı çalıştırmak için Python bağlamaları kullanıyorum:

from selenium import webdriver
wd = webdriver.Firefox()

Ben böyle bir webelement kapmak biliyorum:

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

Ve biliyorum tam sayfa kaynağı ile ...

wd.page_source

Peki "element kaynağını" almak için yine de var mı?

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

Python için selenyum webdriver belgeleri temelde mevcut değildir ve kodda bu işlevselliği etkinleştiren bir şey görmüyorum.

Bir öğenin (ve alt öğelerinin) HTML'sine erişmenin en iyi yolu hakkında düşünceleriniz var mı?


8
Ayrıca tüm wd.page_source
güzelsosoup

Yanıtlar:


747

Öğenin içeriğinin kaynağını veya geçerli öğeye sahip kaynağı innerHTMLalmak için özniteliği okuyabilirsiniz .outerHTML

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Yakut:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Test edildi ve ile çalışıyor ChromeDriver.


9
innerHTML bir DOM özelliği değildir. Yani yukarıdaki cevap işe yaramaz. innerHTML bir javascript javascript değeridir. Yukarıda yapmak null değerini döndürür. Nil'den gelen cevap doğru cevaptır.
12'de bibstha

6
Bu benim için harika çalışıyor ve kabul edilen cevaptan çok daha zarif. Selenyum 2.24.1 kullanıyorum.
Ryan Shillington

22
İnnerHTML bir DOM özelliği olmasa da, tüm büyük tarayıcılar tarafından desteklenmektedir ( quirksmode.org/dom/w3c_html.html ). Benim için de iyi çalışıyor.
CuongHuyTo

3
+1 Bu yakutta da işe yarıyor gibi görünüyor. getAttributeYöntem (veya diğer dillerde eşdeğer) sadece adı arg olan js yöntemini çağırır bir duygu var . Ancak belgeler açıkça bunu söylemez, bu nedenle nilesh'in çözümü bir yedek olmalıdır.
Kelvin

23
Bu başarısız olur HtmlUnitDriver. İçin çalışır ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) ve PhantomJSDriver(başkalarını test etmedim).
acdcjunior

91

Bir html kaynak kodunu almak için basit bir yolu yoktur webelement. JS kullanmanız gerekecek. Python bağlamaları hakkında çok emin değilim ama bunu Java'da kolayca yapabilirsiniz. Eminim JavascriptExecutorPython'da sınıfa benzer bir şey olmalı .

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

1
Bu aslında Python eşdeğeri ile de olsa sonuçlandı.
Chris W.

8
Ben element.getAttribute ("innerHTML") kullanarak aşağıdaki cevabı okumak çok daha kolay olduğunu düşünüyorum. İnsanların neden oy verdiğini anlamıyorum.
Ryan Shillington

1
Javascript'i aramanıza gerek yok. Python'da element.get_attribute ('innerHTML') kullanın
Anthon

6
@Anthon innerHTMLbir DOM özelliği değil. 2011'de bu soruyu cevapladığımda, benim için işe yaramadı, şimdi bazı tarayıcılar destekliyor gibi görünüyor. Sizin için çalışıyorsa kullanmak innerHTMLdaha temizdir. Ancak, tüm tarayıcılarda çalışacağının garantisi yoktur.
nilesh

2
Görünüşe göre, RemoteWebDriver kullanırken innerHTML almanın tek yolu bu
Illidan

73

Elbette, Selenium Python'da aşağıdaki HTML ile tüm kod kaynak kodunu alabiliriz:

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

Dosyaya kaydetmek istiyorsanız:

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

Kaynak kod çok uzun olduğu için bir dosyaya kaydetmenizi öneririm.


2
Bir gecikme ayarlayabilir ve en son kaynağı alabilir miyim? Javascript kullanılarak yüklenmiş dinamik içerik var.
CodeGuru

Sayfa tam olarak yüklenmemiş olsa bile bu işe yarar mı? Ayrıca, @FlyingAtom gibi bir gecikme ayarlamanın herhangi bir yolu var mı?
TheRookierLearner

13

Ruby'de selenyum-webdriver (2.32.1) kullanarak, page_sourcesayfa kaynağının tamamını içeren bir yöntem vardır.


5

Nitelik yöntemini kullanmak aslında daha kolay ve daha basittir.

Ruby'yi Selenyum ve PageObject değerli taşlarla kullanarak, belirli bir öğeyle ilişkilendirilmiş sınıfı elde etmek için, satır element.attribute(Class) .

Öğeye bağlı başka özellikler almak istiyorsanız aynı kavram geçerlidir. Örneğin, bir öğenin Dize isteseydim element.attribute(String),.


4

Eski görünüyor, ama yine de burada olsun. Sizin durumunuzda bunu yapmanın doğru yolu:

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

veya

html = elem.get_attribute('innerHTML')

Her ikisi de benim için çalışıyor (selenyum-sunucu-bağımsız-2.35.0)


3

Selenyum ile Java 2.53.0

driver.getPageSource();

sorunun sorulmadığı
Corey Goldberg

Web sürücüsüne bağlı olarak, getPageSourceyöntem gerçek sayfa kaynağını döndürmeyebilir (yani olası javascript değişiklikleri ile). Döndürülen kaynak, sunucu tarafından gönderilen ham kaynak olabilir. Bu noktadan emin olmak için web sürücüsü dokümanı kontrol edilmelidir.
Stephan

2

Umarım bu yardımcı olabilir: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Aşağıda Java yöntemi açıklanmaktadır:

java.lang.String    getText() 

Ama ne yazık ki Python'da mevcut değil. Böylece yöntem adlarını Java'dan Python'a çevirebilir ve tüm sayfa kaynağını almadan mevcut yöntemleri kullanarak başka bir mantık deneyebilirsiniz ...

Örneğin

 my_id = elem[0].get_attribute('my-id')

6
Python aslında bir "gettext" eşdeğeri var (Ben sadece "metin" özniteliğini düşünüyorum?) Ama aslında sadece HTML etiketleri arasında "düz metin" döndürür ve aslında tam HTML kaynağı döndürmez.
Chris W.

2
Bu, Java'daki yalnızca düz metni (html değil) döndürür.
Ryan Shillington

elem [0] dediğiniz gibi referans vermelisiniz, aksi takdirde işe yaramaz
HelloW


1

InnerHTML, seçilen öğenin içindeki öğeyi döndürür ve externalHTML, seçtiğiniz öğeyle birlikte HTML'nin içine geri döner

Örnek: - Şimdi Elementinizin aşağıdaki gibi olduğunu varsayalım

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

innerHTML öğesi Çıktı

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

outerHTML öğesi Çıktı

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

Canlı Örnek: -

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

Aşağıda farklı ciltleme için gerekli sözdizimini bulacaksınız. Değişim innerHTMLToouterHTML gibi .

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Tam sayfa HTML'si istiyorsanız aşağıdaki kodu kullanın: -

driver.getPageSource();

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

Bu kod gerçekten JavaScript'i kaynaktan almak için çalışıyor!


0

Ve PHPUnit selenyum testinde şöyle:

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

0

Python'da Uzaktan Kumanda için bir çözümle ilgileniyorsanız, innerHTML'yi nasıl edinebileceğiniz aşağıda açıklanmıştır:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")

Yardımın için teşekkürler, bunu kullandım. innerHTML = {solenium selector code}.textAynı işleri de buluyorum .
Shane

0

Tercih ettiğim oluşturulmuş HTML'yi alma yöntemi şu şekildedir:

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

Ancak yukarıdaki yöntem tüm etiketleri kaldırır (evet, iç içe etiketler de) ve yalnızca metin içeriği döndürür. HTML işaretlemesini de almak istiyorsanız aşağıdaki yöntemi kullanın.

print body_html.getAttribute("innerHTML")

1
Sayfanın gövde içeriğine erişmek için driver.find_element_by_tag ("gövde") öğesini de kullanabilirsiniz.
Paslı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.