Не вижу HTML в элементе - PullRequest
       6

Не вижу HTML в элементе

1 голос
/ 24 января 2012

Я могу войти в систему и получить доступ к странице моей учетной записи, вот пример HTML (изменен для краткости и не должен превышать ограничение URL):

    <div class='table m_t_4'>
<table class='data' border=0 width=100% cellpadding=0 cellspacing=0>
    <tr class='title'>
        <td align='center' width='15'><a></a></td>
        <td align='center' width='60'></td>
    </tr>
    <TR bgcolor=>

        <td valign='top' align='center'>1</TD>
        <td valign='top' align='left'><img src='/images/sale_small.png' alt='bogo sale' />Garden Escape Planters</TD>
        <td valign='top' align='right'>13225</TD>
        <td valign='top' align='center'>2012-01-17 11:34:32</TD>
        <td valign='top' align='center'>FILLED</TD>
        <td valign='top' align='center'><A HREF='https://www.daz3d.com/i/account/orderdetail?order=7886745'>7886745</A></TD>
        <td valign='top' align='center'><A HREF='https://www.daz3d.com/i/account/req_dlreset?oi=18087292'>Reset</A>
    </TR>

Обратите внимание, что единственный элемент, который ядействительно нужен первый HREF с "order = 7886745 '> 7886745 <" ... </p>

И есть несколько блоков TR, которые мне нужно прочитать.

Я использую следующую кодировку xpath:

    browser.get('https://www.daz3d.com/i/account/orderitem_hist?')

account_history = browser.find_element_by_xpath("//div[@class='table m_t_4']");
print account_history

product_block = account_history.find_element_by_xpath("//TR[contains(@bgcolor, '')]");
print product_block

product_link = product_block.find_element_by_xpath("//TR/td/A@HREF")
print product_link

Я использую версию веб-драйвера Python FireFox.

Когда я запускаю это, кажется, что xpath account_history и product_block выглядитработать нормально (они печатают как «none», поэтому я предполагаю, что они работали), но я получаю ошибку «expition is not Legal expression» на product_link.

У меня есть 2 вопроса:

1: Почему не работает xpath "// TR / td / A @ HREF"?Предполагается, что он использует product_block - который он (должен быть) просто сегмент TR, поэтому он должен начинаться с TR, а затем искать первый td, имеющий HREF ... правильно?

Iпопытался использовать точный регистр, используемый в HTML, но я думаю, что это не должно иметь значения ...

2: Какую кодировку мне нужно использовать, чтобы увидеть содержимое (HTML / текст) элементов?

Мне нужно сделать это, чтобы получить URL, который мне нужен для вызова следующей страницы.

Я также хотел бы убедиться, что здесь читается правильный HTML-код ... это должно быть обычной частью отладки, ИМХО.

Как хранятся данные элемента?Это в массиве или таблице, которые я могу читать, используя Python?Он должен быть доступен где-то, чтобы быть полезным для тестирования - не так ли?

Я прошу прощения за то, что так запутался, но я вижу много информации об этом в Интернете, и все жебольшая часть этого либо ничего не делает, либо вызывает ошибку.

Кажется, что нет никаких "стандартных" правил кодирования ... и поэтому я немного отчаялся здесь ...

Мне действительно нравится то, что я видел в Selenium вплоть доэтот момент, но мне нужно обойти его, чтобы заставить это работать!

Отредактировано!

ОК, после некоторого сна первый ответ дал подсказку - find_elements_by_xpath создает список ...so я использовал это, чтобы найти все элементы xpath ("// a [содержит (@href, 'https://www.daz3d.com/i/account/orderdetail?order=')]");) во всей истории, затем получил доступ к списку, который он создал ... и записать его в файл, чтобы быть увереннымиз того, что я видел.

Пересмотренный код:

    links = open("listlinks.txt", "w")
browser.get('https://www.daz3d.com/i/account/orderitem_hist?')

account_history = browser.find_element_by_xpath("//div[@class='table m_t_4']");
print account_history.get_attribute("div")

product_links = []
product_links = account_history.find_elements_by_xpath("//a[contains(@href,'https://www.daz3d.com/i/account/orderdetail?order=')]");
print str(len(product_links)) + ' elements'
for index, item in enumerate(product_links):
    link = item.get_attribute("href")
    links.write(str(index) + '\t' + str(link) + '\n')

И это дает мне файл со ссылками, которые мне нужны ...

    0   https://www.daz3d.com/i/account/orderdetail?order=7905687
1   https://www.daz3d.com/i/account/orderdetail?order=7886745
2   https://www.daz3d.com/i/account/orderdetail?order=7854456
3   https://www.daz3d.com/i/account/orderdetail?order=7812189

Так простоЯ не мог увидеть, что он споткнулся ...

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 января 2012

1: Почему не работает xpath "// TR / td / A @ HREF"?Предполагается, что он использует product_block - который он (должен быть) просто сегмент TR, поэтому он должен начинаться с TR, а затем искать первый тд с HREF ... правильно?

WebDriver возвращает только элементы, но не атрибуты указанных элементов, таким образом:

"//TR/td/A" 

работает, но

"//TR/td/A@HREF"

или

"//TR/td/A@ANYTHING"

- нет.

2: Какую кодировку мне нужно использовать, чтобы увидеть содержимое (HTML / текст) элементов?

Чтобы получить внутренний текст:

string innerValue = element.Text;

Чтобы получить innerhtml:

  • Это немного сложнее, вам нужно будет перебирать каждый из дочерних элементов и восстанавливать html на основе этого - или вы можете обработать html с помощью инструмент для соскоба .

Чтобы получить атрибут:

string hrefValue = element.GetAttribute("href");

(C #, возможно, вы сможете сделать перевод на Python)

0 голосов
/ 24 января 2012

Есть и другие способы доступа к элементу, кроме browser.find_element_by_xpath.

Вы можете получить доступ, например, по адресу id или class

browser.find_element_by_id
browser.find_element_by_link_text

browser.find_element
browser.find_element_by_class_name
browser.find_element_by_css_selector
browser.find_element_by_name
browser.find_element_by_partial_link_text
browser.find_element_by_xpath
browser.find_element_by_tag_name

Каждая из перечисленных функций имеет аналогичную функцию, которая возвращает список (просто замените element на elements

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...