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