Получить HTML-источник WebElement в Selenium WebDriver с использованием Python - PullRequest
405 голосов
/ 01 сентября 2011

Я использую привязки 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

Документы Selennium Webdriver для Python в основном не существуюти я не вижу ничего в коде, который, кажется, включает эту функциональность.

Есть какие-нибудь мысли о лучшем способе доступа к HTML-элементу (и его дочерним элементам)?

Ответы [ 13 ]

639 голосов
/ 20 декабря 2011

Вы можете прочитать атрибут innerHTML, чтобы получить источник содержимого элемента или outerHTML для источника с текущего элемента.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Ruby:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Проверено и работает с ChromeDriver.

87 голосов
/ 03 сентября 2011

На самом деле не существует прямого способа получить исходный HTML-код веб-элемента.Вам придется использовать JS.Я не слишком уверен в привязках Python, но вы можете легко сделать это в Java.Я уверен, что в Python должно быть что-то похожее на JavascriptExecutor класс.

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 
64 голосов
/ 20 марта 2013

Конечно, мы можем получить весь исходный код HTML с помощью этого скрипта ниже в Selenium Python:

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()

Я предлагаю сохранить в файл, потому что исходный код очень и очень длинный.

12 голосов
/ 16 апреля 2013

В Ruby с использованием selenium-webdriver (2.32.1) существует метод page_source, который содержит весь источник страницы.

5 голосов
/ 22 марта 2013

Использование метода атрибута, на самом деле, проще и понятнее.

Используя Ruby с гемами Selenium и PageObject, чтобы получить класс, связанный с определенным элементом, строка будет element.attribute(Class).

Та же концепция применяется, если вы хотите привязать другие атрибуты к элементу. Например, если я хотел получить строку элемента, element.attribute(String).

4 голосов
/ 06 марта 2014

Выглядит устаревшим, но пусть это будет здесь в любом случае.Правильный способ сделать это в вашем случае:

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)

2 голосов
/ 30 марта 2016

Ява с Селеном 2.53.0

driver.getPageSource();
2 голосов
/ 07 сентября 2011

Я надеюсь, что это может помочь: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Здесь описан метод Java:

java.lang.String    getText() 

Но, к сожалению, он недоступен в Python. Таким образом, вы можете перевести имена методов в Python из Java и попробовать другую логику, используя существующие методы, не получая весь исходный код страницы ...

1009 * Е.Г. *

 my_id = elem[0].get_attribute('my-id')
1 голос
/ 03 сентября 2017

InnerHTML вернет элемент внутри выбранного элемента, а externalHTML вернет элемент HTML вместе с выбранным вами элементом

Пример: - Теперь предположим, что ваш Элемент как показано ниже

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

элемент innerHTML Вывод

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

элемент externalHTML Вывод

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

Live Пример: -

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

Ниже вы найдете синтаксис, который требует различных привязок. Измените innerHTML на outerHTML в соответствии с необходимостью.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Если вы хотите HTML-код всей страницы, используйте следующий код: -

driver.getPageSource();
0 голосов
/ 04 февраля 2018

Метод получения отрисованного 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...