【发布时间】:2012-01-29 04:10:24
【问题描述】:
我正在使用 python 和 firefox 在 selenium 2/webdrive 中执行以下操作...
我正在打开一些需要检查特定字符串的网页 - 如果存在,则意味着它是一个很好的解析页面。
我正在寻找的短语是一个类似于此的 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 中没有简单的方法可以做到这一点!
【问题讨论】:
-
这是为了测试目的吗?有什么理由避免像
pytest或unittest这样的python 测试模块吗?我有类似的情况,除非它们都通过,否则 selenium 不会运行所有测试用例。使用 pytest 我可以做到这一点。除了还有其他好处。 -
实际上,不——他不是为了测试。我正在使用 Webdriver 来修改我所有的自定义编写的网络爬虫 - 因为网站不断更改 HTML,所以这些爬虫一直在中断……有时我认为他们这样做只是为了让我烦恼。 Webdriver 应该更容易保持最新状态,因为它本质上更加模块化,而且我不必费力地通过尽可能多的代码来找到问题。另外,我的一位客户无法让她的网络使用我一直使用的机械化代码访问网络。希望她能使用这个版本。