Получение HTML-источника WebElement в Selenium WebDriver с использованием Python
Я использую Python-биндинги для работы с Selenium WebDriver:
from selenium import webdriver
wd = webdriver.Firefox()
Я знаю, что могу получить элемент на странице следующим образом:
elem = wd.find_element_by_css_selector('#my-id')
Также я знаю, что могу получить исходный код всей страницы с помощью:
wd.page_source
Но существует ли способ получить "исходный код элемента"?
elem.source # <-- возвращает HTML в виде строки
Документация Selenium WebDriver для Python практически отсутствует, и я не вижу ничего в коде, что могло бы обеспечить эту функциональность.
Какой лучший способ получить HTML элемента (и его дочерних элементов)?
5 ответ(ов)
Вы можете использовать атрибут innerHTML
, чтобы получить исходный контент элемента, или outerHTML
, чтобы получить источник с самим элементом.
Примеры на разных языках:
Python:
element.get_attribute('innerHTML')
Java:
elem.getAttribute("innerHTML");
C#:
element.GetAttribute("innerHTML");
Ruby:
element.attribute("innerHTML")
JavaScript:
element.getAttribute('innerHTML');
PHP:
$element->getAttribute('innerHTML');
Это было протестировано и работает с использованием ChromeDriver
.
Вот как можно получить HTML-код страницы с помощью Selenium на Python:
elem = driver.find_element("xpath", "//*")
source_code = elem.get_attribute("outerHTML")
А вот как сохранить этот HTML в файл:
with open('c:/html_source_code.html', 'w', encoding='utf-8') as f:
f.write(source_code)
Обратите внимание, что я добавил параметр encoding='utf-8'
при открытии файла, чтобы корректно сохранить символы.
Нет простого способа получить HTML код элемента webelement
. Для этого вам потребуется использовать JavaScript. Я не совсем уверен относительно биндингов для Python, но в Java это можно сделать следующим образом. Уверен, что в Python есть нечто подобное классу JavascriptExecutor
.
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
Для Python вы можете использовать метод execute_script
из библиотеки Selenium. Вот аналогичный код:
element = driver.find_element(By.ID, "foo")
contents = driver.execute_script("return arguments[0].innerHTML;", element)
Таким образом, вы сможете получить HTML-код интересующего вас элемента.
В Ruby с использованием selenium-webdriver (версия 2.32.1) есть метод page_source
, который возвращает весь исходный код страницы.
Если вы хотите получить исходный код текущей страницы, вы можете использовать следующий код:
require 'selenium-webdriver'
# Инициализация драйвера
driver = Selenium::WebDriver.for :chrome
# Открытие страницы
driver.get 'http://example.com'
# Получение исходного кода страницы
page_source = driver.page_source
puts page_source
# Не забудьте закрыть драйвер после использования
driver.quit
Этот код создает экземпляр веб-драйвера, загружает указанную страницу и затем использует метод page_source
, чтобы получить и вывести весь HTML-код страницы в консоль.
Это выглядит устаревшим, но пусть будет здесь. Правильный способ сделать это в вашем случае:
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).
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Преобразование списка словарей в DataFrame pandas
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как отменить последнюю миграцию?
Ошибка: "'dict' объект не имеет метода 'iteritems'"