Получить 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 ответов:
вы можете узнать
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)
Я надеюсь, что это может помочь: 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>
Живой Пример : -
ниже вы найдете синтаксис, который требует в соответствии с другой привязки. Измените
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")