รับแหล่ง HTML ของ WebElement ใน Selenium WebDriver โดยใช้ Python


476

ฉันกำลังใช้การผูก Python เพื่อเรียกใช้ Selenium WebDriver:

from selenium import webdriver
wd = webdriver.Firefox()

ฉันรู้ว่าฉันสามารถคว้าองค์ประกอบเว็บได้เช่นนี้:

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

และฉันรู้ว่าฉันสามารถรับซอร์สเต็มหน้าด้วย ...

wd.page_source

แต่มีเพื่อรับ "แหล่งองค์ประกอบ" หรือไม่

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

ซีเลเนี่ยม webdriver docs สำหรับ Python นั้นไม่มีอยู่จริงและฉันไม่เห็นอะไรเลยในรหัสที่ดูเหมือนว่าจะเปิดใช้งานการทำงานนั้น

มีความคิดเกี่ยวกับวิธีที่ดีที่สุดในการเข้าถึง HTML ขององค์ประกอบ (และลูก ๆ ) หรือไม่


8
คุณยังสามารถแยกวิเคราะห์ทั้งหมดwd.page_sourceด้วย beautifulsoup
eLRuLL

คำตอบ:


747

คุณสามารถอ่านinnerHTMLคุณสมบัติเพื่อรับแหล่งเนื้อหาขององค์ประกอบหรือouterHTMLแหล่งที่มาด้วยองค์ประกอบปัจจุบัน

งูหลาม:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

ค#:

element.GetAttribute("innerHTML");

ทับทิม:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

ChromeDriverการทดสอบและการทำงานร่วมกับ


9
innerHTML ไม่ใช่แอตทริบิวต์ DOM ดังนั้นคำตอบข้างต้นจะไม่ทำงาน innerHTML เป็นค่าจาวาสคริปต์ การดำเนินการด้านบนจะคืนค่าว่าง คำตอบโดย nilesh เป็นคำตอบที่เหมาะสม
bibstha

6
มันใช้งานได้ดีสำหรับฉันและมีความสวยงามกว่าคำตอบที่ยอมรับ ฉันใช้ซีลีเนียม 2.24.1
Ryan Shillington

22
แม้ว่า innerHTML ไม่ใช่แอตทริบิวต์ DOM แต่ก็ได้รับการสนับสนุนอย่างดีจากเบราว์เซอร์หลักทั้งหมด ( quirksmode.org/dom/w3c_html.html ) มันทำงานได้ดีสำหรับฉัน
CuongHuy ถึง

3
+1 สิ่งนี้ดูเหมือนว่าจะทำงานในทับทิมด้วย ฉันรู้สึกว่าgetAttributeวิธีการ (หรือเทียบเท่าในภาษาอื่น ๆ ) เพียงแค่เรียกวิธีการ js ที่มีชื่อเป็นหาเรื่อง อย่างไรก็ตามเอกสารไม่ได้กล่าวอย่างชัดเจนดังนั้นทางออกของ nilesh จึงควรเป็นทางเลือก
เคลวิน

23
HtmlUnitDriverนี้ล้มเหลว การทำงานสำหรับChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) และPhantomJSDriver(ผมไม่ได้ทดสอบอื่น ๆ )
acdcjunior

91

ที่มีอยู่ไม่จริงเป็นวิธีที่ตรงไปตรงมาของการได้รับรหัสที่มา HTML webelementของ คุณจะต้องใช้ JS ฉันไม่แน่ใจเกี่ยวกับการผูก python แต่คุณสามารถทำสิ่งนี้ใน Java ได้อย่างง่ายดาย ฉันแน่ใจว่าต้องมีบางสิ่งที่คล้ายกับJavascriptExecutorคลาสใน Python

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

1
นี่คือสิ่งที่ฉันทำลงเอยด้วยการใช้ Python ที่เทียบเท่า
Chris W.

8
ฉันคิดว่าคำตอบด้านล่างโดยใช้ element.getAttribute ("innerHTML") นั้นอ่านง่ายกว่ามาก ฉันไม่เข้าใจว่าทำไมผู้คนถึงลงคะแนน
Ryan Shillington

1
ไม่จำเป็นต้องโทรจาวาสคริปต์เลย ใน Python ให้ใช้ element.get_attribute ('innerHTML')
Anthon

6
@Anthon innerHTMLไม่ใช่แอตทริบิวต์ DOM เมื่อฉันตอบคำถามนี้ในปี 2011 มันไม่ได้ผลสำหรับฉันดูเหมือนว่าตอนนี้เบราว์เซอร์บางตัวสนับสนุน ถ้ามันเหมาะกับคุณการใช้innerHTMLก็สะอาดกว่า อย่างไรก็ตามไม่มีการรับประกันว่ามันจะทำงานบนเบราว์เซอร์ทั้งหมด
nilesh

2
เห็นได้ชัดว่านี่เป็นวิธีเดียวที่จะได้รับ innerHTML ในขณะที่ใช้ RemoteWebDriver
Illidan

73

แน่นอนว่าเราสามารถรับซอร์สโค้ด HTML ทั้งหมดด้วยสคริปต์นี้ด้านล่างใน Selenium Python:

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

หากคุณต้องการบันทึกเป็นไฟล์:

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

ฉันแนะนำให้บันทึกไฟล์เพราะซอร์สโค้ดยาวมาก


2
ฉันสามารถตั้งค่าการหน่วงเวลาและรับแหล่งข้อมูลล่าสุดได้หรือไม่ มีเนื้อหาแบบไดนามิกโหลดโดยใช้จาวาสคริปต์
CodeGuru

มันใช้งานได้แม้ว่าหน้าจะไม่ได้โหลดเต็มหรือไม่? นอกจากนี้ยังมีวิธีใดที่จะตั้งค่าความล่าช้าเช่น @FlyingAtom
TheRookierLearner

13

ใน Ruby ใช้ selenium-webdriver (2.32.1) มีpage_sourceวิธีการที่ประกอบด้วยแหล่งหน้าทั้งหมด


5

ในความเป็นจริงแล้วการใช้วิธีการของแอตทริบิวต์นั้นง่ายขึ้นและตรงไปตรงมามากขึ้น

ใช้ทับทิมกับซีลีเนียมและ PageObject element.attribute(Class)อัญมณีเพื่อให้ได้ระดับที่เกี่ยวข้องกับองค์ประกอบบางสายจะเป็น

ใช้แนวคิดเดียวกันนี้หากคุณต้องการรับคุณลักษณะอื่น ๆ ที่เชื่อมโยงกับองค์ประกอบ ตัวอย่างเช่นถ้าฉันต้องการสตริงขององค์ประกอบ, element.attribute(String).


4

ดูล้าสมัย แต่ให้อยู่ที่นี่ต่อไป วิธีที่ถูกต้องที่จะทำในกรณีของคุณ:

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)


3

Java with Selenium 2.53.0

driver.getPageSource();

นั่นไม่ใช่คำถามที่ถาม
Corey Goldberg

getPageSourceวิธีนี้อาจไม่ส่งคืนแหล่งที่มาของหน้าจริง (เช่นอาจมีการเปลี่ยนแปลงจาวาสคริปต์) ทั้งนี้ขึ้นอยู่กับ webdriver แหล่งที่มาที่ส่งคืนอาจเป็นแหล่งข้อมูลดิบที่ส่งจากเซิร์ฟเวอร์ ต้องตรวจสอบเอกสารของ webdriver เพื่อให้แน่ใจในจุดนี้
เตฟาน

2

ฉันหวังว่านี่จะช่วยได้: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

นี่คือวิธีการอธิบาย Java:

java.lang.String    getText() 

แต่น่าเสียดายที่ไม่มีใน Python ดังนั้นคุณสามารถแปลชื่อเมธอดเป็น Python จาก Java และลองใช้ตรรกะอื่นโดยใช้วิธีการนำเสนอโดยไม่ได้รับทั้งหน้า ...

เช่น

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

6
Python จริง ๆ แล้วมี "gettext" เทียบเท่ากัน (ฉันคิดว่ามันเป็นเพียงแค่ "text" คุณลักษณะ?) แต่ที่จริงแล้วเพียงแค่คืน "plaintext" ระหว่างแท็ก HTML และจะไม่ส่งคืนต้นฉบับ HTML แบบเต็ม
Chris W.

2
ส่งกลับเฉพาะข้อความธรรมดา (ไม่ใช่ html) ใน Java เช่นกัน
Ryan Shillington

คุณต้องอ้างอิงมันเหมือนที่คุณพูดว่า elem [0] มิฉะนั้นมันใช้ไม่ได้
HelloW


1

InnerHTML จะส่งคืนองค์ประกอบภายในองค์ประกอบที่เลือกและ outerHTML จะกลับมาภายใน HTML พร้อมกับองค์ประกอบที่คุณเลือก

ตัวอย่าง: - ตอนนี้สมมติว่าองค์ประกอบของคุณเป็นด้านล่าง

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

องค์ประกอบ InnerHTML เอาท์พุท

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

องค์ประกอบภายนอก HTML

<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

ด้านล่างนี้คุณจะพบไวยากรณ์ที่ต้องใช้ตามการเชื่อมต่อที่แตกต่างกัน เปลี่ยนinnerHTMLไปouterHTMLตามความจำเป็น

งูหลาม:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

หากคุณต้องการให้ HTML ทั้งหมดใช้โค้ดด้านล่าง: -

driver.getPageSource();

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

รหัสนี้ใช้งานได้จริงเพื่อรับ JavaScript จากซอร์สเช่นกัน!


0

และในการทดสอบซีลีเนียม PHPUnit มันเป็นแบบนี้:

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

0

หากคุณสนใจวิธีแก้ปัญหาสำหรับ Remote Control ใน Python ต่อไปนี้เป็นวิธีรับ InnerHTML:

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

ขอบคุณสำหรับความช่วยเหลือฉันได้ใช้สิ่งนี้ ฉันยังค้นหาinnerHTML = {solenium selector code}.textงานที่เหมือนกัน
เชน

0

วิธีรับ 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")

1
คุณยังสามารถใช้ driver.find_element_by_tag ("body") เพื่อเข้าถึงเนื้อหาเนื้อหาของหน้า
สนิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.