Получить 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 # <-- returns the HTML as a string
Документы selenium webdriver для Python в основном отсутствуют, и я не вижу ничего в коде, который, похоже, позволяет эту функциональность.
Любые мысли о наилучшем способе доступа к HTML элемента (и его дочерних элементов)?
Ответы
Ответ 1
Вы можете прочитать атрибут innerHTML
чтобы получить источник содержимого элемента или outerHTML
для источника с текущим элементом.
Python:
element.get_attribute('innerHTML')
Джава:
elem.getAttribute("innerHTML");
С#:
element.GetAttribute("innerHTML");
Рубин:
element.attribute("innerHTML")
JS:
element.getAttribute('innerHTML');
PHP:
$element->getAttribute('innerHTML');
Протестировано и работает с ChromeDriver
.
Ответ 2
На самом деле нет прямого способа получить исходный код html веб-элемента. Вам придется использовать JS. Я не слишком уверен в связях python, но вы можете легко сделать это на Java. Я уверен, что в Python должно быть что-то похожее на класс JavascriptExecutor
.
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
Ответ 3
Конечно, мы можем получить весь исходный код HTML с этим script ниже в 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()
Я предлагаю сохранить файл, потому что исходный код очень длинный.
Ответ 4
В Ruby, используя selenium-webdriver (2.32.1), существует метод page_source
, который содержит весь источник страницы.
Ответ 5
Использование метода атрибута, по сути, проще и более прямолинейно.
Используя Ruby с драгоценными камнями Selenium и PageObject, чтобы получить класс, связанный с определенным элементом, строка будет element.attribute(Class)
.
Такая же концепция применяется, если вы хотите получить другие атрибуты, привязанные к элементу. Например, если мне нужна строка элемента, element.attribute(String)
.
Ответ 6
Выглядит устаревшим, но пусть он будет здесь в любом случае. Правильный способ сделать это в вашем случае:
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)
Ответ 7
Надеюсь, это может помочь:
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')
Ответ 8
Java с Selenium 2.53.0
driver.getPageSource();
Ответ 9
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();
Ответ 10
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
Этот код действительно работает, чтобы получить JavaScript от источника!
Ответ 11
Если вас интересует решение для удаленного управления в Python, вот как получить innerHTML:
innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
Ответ 12
И в PHPUnit selenium проверьте это следующим образом:
$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');
Ответ 13
Метод получения визуализированного 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")
Ответ 14
Я пытаюсь сделать именно эту вещь и постоянно получаю сообщение об ошибке: "{attributeError}" список "объект не имеет атрибута" get_attribute ""
мой код:
element = driver.find_elements_by_xpath("//*[@id='dashboard-container-d08a6dcd-dc17-4662-9156-7fe74a4abc15']/div[1]/div[2]/div/div/form/div[5]/table/tbody")
el = element.get_attribute("outerHTML")
# Я пробовал innerHTML/outerHTML/одинарные кавычки, двойные кавычки... XPath возвращает строки, содержащие текст, который я ищу, используя консоль элемента inspect...
Есть идеи здесь?
Ответ 15
Это работает без проблем для меня.
element.get_attribute('innerHTML')