首先,我创建了几个函数来使用它们而不是默认的" 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,浏览器会话将不会被杀死,我必须手动转到VM并终止Firefox的进程。当网络浏览器进程处于活动状态时,詹金斯不会阻止它的工作。
所以我遇到了这个问题,我希望它可能因异常处理而得到解决。 我尝试将此添加到我的自定义函数中,但不清楚究竟发生了异常的位置。即使我得到了行号,它也会将我带到我的自定义函数,但不会被调用的地方:
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.find_element_by_id(element)"它的用途是用于调试。在我的情况下,我有近3000行,所以我需要一个propper行号。
请与我分享你的经验。
PS:我把我的程序划分为几个脚本,其中一个只包含selenium部分,这就是为什么我需要login()函数,从另一个脚本调用它并在其中使用返回的对象。
答案 0 :(得分:2)
好吧,花一些时间在我的脑海里,我找到了一个合适的解决方案。
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)
很明显,我错过了它:(