我在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'
这是控制台的屏幕截图,显示我得到的异常:
我想要使用的另一个选项是从webdriver获取页面的源代码并查找标签是否存在 - 但显然在webdriver中没有简单的方法可以做到这一点!
答案 0 :(得分:0)
如果您不知道预期的异常,请使用空的except
和traceback
:
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'
这就像我需要它一样。
再次,谢谢。