Получить 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

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

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


8
Вы также можете просто разобрать все wd.page_sourceс Beautifulsoup
eLRuLL

Ответы:


748

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

Python:

element.get_attribute('innerHTML')

Ява:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Рубин:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

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


9
innerHTML не является атрибутом DOM. Так что выше ответ не сработает. innerHTML - это значение javascript javascript. Выполнение выше вернет ноль. Ответ nilesh является правильным ответом.
bibstha

6
Это прекрасно работает для меня и намного элегантнее, чем принятый ответ. Я использую Selenium 2.24.1.
Райан Шиллингтон

22
Хотя innerHTML не является атрибутом DOM, он хорошо поддерживается всеми основными браузерами ( quirksmode.org/dom/w3c_html.html ). Это также хорошо работает для меня.
CuongHuyTo

3
+1 Похоже, это работает и в ruby. У меня такое ощущение, что getAttributeметод (или эквивалент в других языках) просто вызывает метод js, имя которого - arg. Однако в документации явно не сказано об этом, поэтому решение 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.
Крис У.

8
Я думаю, что ответ ниже, используя element.getAttribute ("innerHTML"), намного проще для чтения. Я не понимаю, почему люди голосуют за это.
Райан Шиллингтон

1
Не нужно вызывать JavaScript вообще. В Python просто используйте element.get_attribute ('innerHTML')
Anthon

6
@Anthon innerHTMLне является атрибутом DOM. Когда я ответил на этот вопрос в 2011 году, он не работал для меня, похоже, что некоторые браузеры его поддерживают. Если это работает для вас, то используйте innerHTMLчище. Однако нет гарантии, что он будет работать во всех браузерах.
nilesh

2
По-видимому, это единственный способ получить innerHTML при использовании RemoteWebDriver
Иллидан

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
Могу ли я установить задержку и получить последний источник? Динамическое содержимое загружено с использованием JavaScript.
CodeGuru

Работает ли это, даже если страница загружена не полностью? Кроме того, есть ли способ установить задержку, как упоминалось @FlyingAtom?
TheRookierLearner

13

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


5

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

Используя Ruby с гемами Selenium и 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

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

driver.getPageSource();

это не то, о чем спрашивал вопрос
Кори Голдберг

В зависимости от веб-драйвера, getPageSourceметод может не возвращать фактический источник страницы (т.е. с возможными изменениями JavaScript). Возвращенный источник может быть необработанным источником, отправленным сервером. Чтобы убедиться в этом, необходимо проверить документ веб-драйвера.
Стефан

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»?), Но он на самом деле просто возвращает «открытый текст» между тегами HTML и фактически не возвращает полный исходный код HTML.
Крис У.

2
Это возвращает только простой текст (не HTML) в Java тоже.
Райан Шиллингтон

вы должны ссылаться на него, как вы сказали elem [0], иначе это не сработает
HelloW


1

InnerHTML вернет элемент внутри выбранного элемента, а outerHTML вернет элемент 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>

Живой пример: -

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

Ява:

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

Если вы заинтересованы в решении для удаленного управления в 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") для доступа к содержанию тела страницы.
Расти
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.