Получить HTML источник WebElement в Selenium WebDriver с помощью Python


Я использую привязки Python для запуска Selenium WebDriver.

from selenium import webdriver
wd = webdriver.Firefox()

Я знаю, что могу захватить webelement вот так...

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

и я знаю, что могу получить полный источник страницы...

wd.page_source

но в любом случае, чтобы получить "исходный элемент"?

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

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

любые мысли по поводу лучший способ получить доступ к HTML элемент (и его дети)?

13 336

13 ответов:

вы можете узнать innerHTML атрибут, чтобы получить источник контент или outerHTML источник С текущий элемент.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

Ruby:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$elem.getAttribute('innerHTML');

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

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

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

конечно, мы можем получить весь исходный код 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()

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

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

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

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

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

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

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)

Java с селеном 2.53.0

driver.getPageSource();

Я надеюсь, что это может помочь: 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')

и в PHPUnit selenium test это выглядит так:

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

Если вас интересует решение для удаленного управления в Python, вот как получить innerHTML:

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

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

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

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

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

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

вывод элемента outerHTML

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

Java:

elem.getAttribute("innerHTML");

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

driver.getPageSource();

метод получения отрисованного 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")
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return      arguments[0].innerHTML;", element); 

этот код действительно работает, чтобы получить JavaScript из источника, а также!