寻找当前页面的元素或来源的文本

时间:2012-01-28 06:09:16

标签: python firefox webdriver

我在selenium 2 / webdrive中使用python和firefox进行以下操作......

我正在打开一些我需要检查特定字符串的网页 - 如果存在,则意味着它是一个很好的解析页面。

我正在寻找的短语是一个类似于此的h2元素:

<h2 class="page_title">Worlds Of Fantasy : Medieval House</h2>

如果缺少h2,我知道我不需要处理它,只需返回并获得下一个。

在代码中我有一个try / exception / else块来查找短语,如果它看到它会传递给函数的下一部分。如果没有,它应该转到else,告诉它返回。

在这个测试中有2个页面被调用 - 第一个有短语,第二个没有。

打开第一页,然后通过测试。

打开第二个页面,我收到一个异常报告 - 但它永远不会返回到main中的调用代码...它只是停止。

为什么不能以正常的方式退回?

以下是代码:

    #!/usr/bin/env python

from selenium import webdriver
from selenium.webdriver import Firefox as Browser
from selenium.webdriver.support.ui import WebDriverWait


browser = webdriver.Firefox()

def call_productpage(productlink):
    global browser

    print 'in call_productpage(' + productlink + ')'
    browser.get(productlink)
    browser.implicitly_wait(8)

    #start block with <div class="page_content"> 
    product_block = browser.find_element_by_xpath("//div[@class='page_content']");

    # <h2 class="page_title">Worlds Of Fantasy : Medieval House</h2>
    try:
        product_name = product_block.find_element_by_xpath("//h2[@class='page_title']");
    except Exception, err:
        #print "Failed!\nError (%s): %s" % (err.__class__.__name__, err)
        print 'return to main()'
        return 0
    else:
        nameStr = str(product_name.text)
        print 'product_name:' + nameStr
    finally:
        print "test over!"
        return 1

test1 = call_productpage('https://www.daz3d.com/i/3d-models/-/desk-clocks?spmeta=ov&item=12657')
if test1:
    print '\ntest 1 went OK\n'
else:
    print '\ntest 1 did NOT go OK\n'

tes2 = call_productpage('https://www.daz3d.com/i/3d-models/-/dierdre-character-pack?spmeta=ov&item=397')
if test2:
    print '\ntest 2 went OK\n'
else:
    print '\ntest 2 did NOT go OK\n'

这是控制台的屏幕截图,显示我得到的异常:

enter image description here

我想要使用的另一个选项是从webdriver获取页面的源代码并查找标签是否存在 - 但显然在webdriver中没有简单的方法可以做到这一点!

2 个答案:

答案 0 :(得分:0)

如果您不知道预期的异常,请使用空的excepttraceback

import traceback

try:
    int('string')
except:
    traceback.print_exc()
    print "returning 0"

# will print out an exception and execute everything in the 'except' clause:
# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# ValueError: invalid literal for int() with base 10: 'string'
# returning 0

但是从堆栈跟踪中你已经知道确切的异常名称,所以请改为使用它:

from selenium.webdriver.exceptions import NoSuchElementException

try:
    #...
except NoSuchElementException, err:
    #...

更新:

您只需在try ... except 之前获得例外<:>

product_block = browser.find_element_by_xpath("//div[@class='page_content']");

而不是在这里:

product_name = product_block.find_element_by_xpath("//h2[@class='page_title']");

答案 1 :(得分:0)

这就是解决方案!谢谢!

这是最终的代码,清理了一下以使结果更具可读性:

    #!/usr/bin/env python

from selenium import webdriver
from selenium.webdriver import Firefox as Browser
from selenium.webdriver.support.ui import WebDriverWait

browser = webdriver.Firefox()

def call_productpage(productlink):
    global browser

    print 'in call_productpage(' + productlink + ')'
    browser.get(productlink)
    browser.implicitly_wait(1)
    product_block = ''
    try:
        product_block = browser.find_element_by_xpath("//div[@class='page_content']");
    except:
        print 'this is NOT a good page - drop it'
        return 0
    else:
        textStr = str(product_block.text)
        #print 'page_content:' + str(textStr)
        print '\nthis is a good page - proceed\n'

    print 'made it past the exception!\n'

    product_name = product_block.find_element_by_xpath("//h2[@class='page_title']");
    nameStr = str(product_name.text)
    print '>>> product_name:' + nameStr + '\n'
    print "test over!"
    return 1

test1 = call_productpage('https://www.daz3d.com/i/3d-models/-/desk-clocks?spmeta=ov&item=12657')
print '\nTest #1:\n============\n'
if test1:
    print '\ntest 1 returned true\n'
else:
    print '\ntest 1 returned false\n'

print '\nTest #2:\n============\n'
test2 = call_productpage('https://www.daz3d.com/i/3d-models/-/dierdre-character-pack?spmeta=ov&item=397')
if test2:
    print '\ntest 2 returned true\n'
else:
    print '\ntest 2 returned false\n'
print '\n============\n'

这就像我需要它一样。

再次,谢谢。