首先,我创建了几个函数来使用它们代替默认的“find_element_by_...”和 login() 函数来创建“浏览器”。这是我使用它的方式:
def login():
browser = webdriver.Firefox()
return browser
def find_element_by_id_u(browser, element):
try:
obj = WebDriverWait(browser, 10).until(
lambda browser : browser.find_element_by_id(element)
)
return obj
#########
driver = login()
find_element_by_link_text_u(driver, 'the_id')
现在我通过 jenkins 使用此类测试(并在虚拟机上启动它们)。如果我得到 TimeoutException,浏览器 session 将不会被终止,我必须手动转到 VM 并终止 Firefox 的进程。当 Web 浏览器进程处于事件状态时,jenkins 不会停止它的工作。
所以我遇到了这个问题,我希望它可能会由于异常处理而被解决。 我试图将其添加到我的自定义函数中,但不清楚究竟是哪里发生了异常。即使我得到行号,它也会带我到我的自定义函数,而不是调用它的地方:
def find_element_by_id_u(browser, element):
try:
obj = WebDriverWait(browser, 1).until(
lambda browser : browser.find_element_by_id(element)
)
return obj
except TimeoutException, err:
print "Timeout Exception for element '{elem}' using find_element_by_id\n".format(elem = element)
print traceback.format_exc()
browser.close()
sys.exit(1)
#########
driver = login()
driver .get(host)
find_element_by_id_u('jj_username').send_keys('login' + Keys.TAB + 'passwd' + Keys.RETURN)
这将为我打印字符串“lambda browser : browser.find_element_by_id(element)”的行号,这对调试很有用。在我的例子中,我有近 3000 行,所以我需要一个适当的行号。
能否请您与我分享您的经验。
PS:我把我的程序分成几个脚本,其中一个只包含 selenium 部分,这就是为什么我需要 login() 函数,从另一个脚本调用它并在其中使用返回的对象。
最佳答案
好吧,在我的脑海里花了一些时间,我找到了一个合适的解决方案。
def login():
browser = webdriver.Firefox()
return browser
def find_element_by_id_u(browser, element):
try:
obj = WebDriverWait(browser, 10).until(
lambda browser : browser.find_element_by_id(element)
)
return obj
#########
try:
driver = login()
find_element_by_id_u(driver, 'the_id')
except TimeoutException:
print traceback.format_exc()
browser.close()
sys.exit(1)
太明显了,我错过了:(
关于python - 如何在 selenium,python 中处理 TimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28585866/