Не видно HTML в элементе

Я могу войти в систему и получить доступ к странице своей учетной записи, вот образец 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‹"...

И есть несколько блоков 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», поэтому я предполагаю, что они работали), но я получаю сообщение об ошибке «выражение не является допустимым выражением» на product_link.

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

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

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

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

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

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

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

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

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

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

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

Хорошо, немного поспав, первый ответ дал подсказку - find_elements_by_xpath создает список... поэтому я использовал его, чтобы найти все xpath("//a[contains(@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

Настолько просто, что я не мог увидеть это из-за того, что споткнулся об него...

Спасибо!


person Stephen    schedule 24.01.2012    source источник


Ответы (2)


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

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

"//TR/td/A" 

работает, но

"//TR/td/A@HREF"

or

"//TR/td/A@ANYTHING"

не.

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

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

string innerValue = element.Text;

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

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

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

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

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

person Anders    schedule 24.01.2012
comment
Смотрите мои правки выше — вы оба дали мне подсказку, мне просто нужно было поспать! Спасибо! - person Stephen; 25.01.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

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

person 0xc0de    schedule 24.01.2012
comment
Это правда, но в данном случае строка ‹td valign='top' align='center'›‹A HREF='daz3d.com/i/account/› похоже, отсутствуют какие-либо другие методы... Нет ни класса, ни id, без имени - и текст в ссылке непостоянен... поэтому пробую xpath. - person Stephen; 24.01.2012