无法在元素中看到HTML

时间:2012-01-24 05:58:23

标签: python selenium webdriver

我可以登录并访问我的帐户页面,以下是HTML示例(为简洁而修改,不超过网址限制):

    <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,其中&#34; order = 7886745&#39;&gt; 7886745&lt;&#34; ...

我需要阅读几个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版本的webdriver。

当我运行它时,account_history和product_block xpath似乎工作正常(它们打印为&#34;无&#34;所以我认为它们有效),但我得到了一个&#34;不是一个法律表达&#34; product_link上的错误。

我有两个问题:

1:为什么没有&#34; // TR / td / A @ HREF&#34; xpath工作?它应该使用product_block - 它(应该)只是TR段,所以它应该从TR开始,然后寻找具有HREF的第一个td ......正确吗?

我尝试使用HTML中使用的确切案例,但我认为这不应该......

2:我需要使用什么编码来查看元素的内容(HTML /文本)?

我需要能够这样做才能获得下一页要调用的URL。

我还想确保在这里阅读正确的HTML ...这应该是调试的正常部分,恕我直言。

如何存储元素数据?它是在我可以使用Python读取的数组或表中吗?它必须在某个地方可用,以便在测试中有任何用处 - 不是吗?

我为这么困惑而道歉,但我在网上看到了很多关于此的信息,但其中很多都没有做任何事情,或者它会导致错误。

似乎没有任何&#34;标准&#34;可用的编码规则......所以我在这里有点绝望......

到目前为止,我真的很喜欢Selenium所看到的内容,但我需要通过它来实现这一目标!

编辑!

好吧,在得到一些睡眠后,第一个答案提供了线索 - find_elements_by_xpath创建一个列表...所以我用它来查找所有的xpath(&#34; // a [contains(@href,&#39) ; HTTPS://www.daz3d.com/i/account/orderdetail顺序=&#39)]&#34);?整个历史中的元素,然后访问它创建的列表...并将其写入文件,以确保我所看到的。

修订后的代码:

    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 :(得分:0)

browser.find_element_by_xpath之外,还有其他方法可以访问元素。

您可以访问例如idclass

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

注意:我已将前两行分开,因为我认为它们可能对您有帮助。

答案 1 :(得分:0)

  

1:为什么“// TR / td / A @HREF”xpath没有工作?它应该是   使用product_block - 它(应该)只是TR段,所以   它应该从TR开始,然后寻找具有的第一个td   HREF ...正确吗?

WebDriver只返回元素,而不是所述元素的属性,因此:

"//TR/td/A" 

有效,但

"//TR/td/A@HREF"

"//TR/td/A@ANYTHING"

没有。

  

2:我需要使用什么编码来查看内容(HTML /文本)   元素?

要检索innertext:

string innerValue = element.Text;

要检索innerhtml:

  • 这有点困难,您需要遍历每个子元素并根据它重建html - 或者您可以使用scraping tool处理html。

要检索属性:

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

(C#,希望你能翻译成Python)