Appium appium python 中 try,except 用法请教 !

小阿飞 · 2016年12月19日 · 最后由 Helix 回复于 2016年12月21日 · 1837 次阅读

使用场景:安装 app 首次打开后,会有 3-4 个弹窗需要点击处理才能进行下一步操作,我的目的就是有弹窗的时候点击关闭掉,然后进行我之后的主要测试,
我使用了 try,except 方法,如下:

try:
    driver.find_element_by_name('允许').click()
except NoSuchElementException:
    driver.find_element_by_name('切换').click()
except NoSuchElementException:
    driver.find_element_by_id('com.tuniu.app.ui:id/iv_close').click()
except NoSuchElementException:
    driver.find_element_by_id('com.tuniu.app.ui:id/iv_style3_card_1').click()

写完就感觉不太靠谱,如果只有一个 except 还是能正常执行的,
上面用了多个 except,运行后报错:
driver.find_element_by_name('允许').click()
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.
driver.find_element_by_name('切换').click()
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

求助大家,只要能实现我想要的目的结果就行。

共收到 11 条回复 时间 点赞

先判断弹窗是否可见,可见就点击,不可见就等待

匿名 #2 · 2016年12月19日

我没有处理过多个 except,但你这几个 except 异常都一样呀,默认执行第一个所以不能执行下面的语句

应该这样写

try:
    driver.find_element_by_name('允许').click()
except NoSuchElementException:
    try:
        driver.find_element_by_name('切换').click()
    except NoSuchElementException:
        try:
            driver.find_element_by_id('com.tuniu.app.ui:id/iv_close').click()
        except NoSuchElementException:
            try:
                driver.find_element_by_id('com.tuniu.app.ui:id/iv_style3_card_1').click()
            except ...

多重 try-except 嵌套

你的写法 except 之间是并列的,尝试捕获的都是driver.find_element_by_name('允许').click()的异常,
所以第二个driver.find_element_by_name('切换').click()仍会抛出异常

你竟然不嵌套,请看 python 语法

Python 记得用游标卡尺

匿名 #6 · 2016年12月20日

你这样写,还不如用 if - elif 呢,不过,关闭弹窗,你可以用一下 appium 自带的参数 autoAcceptAlerts = True ,可以自动关闭弹窗,另外,建议你这种语法的问题,你可以写搜一下用法看看例子,实在搞不定再来问

用 if 嵌套 + 判断控件是否存在的笨办法,记得 appium 有这个方法 去看看 api,虽然写起来多花几分钟,但是稳

#3 楼 @pyattack 用了嵌套确实没有报错了,但是还有个问题,就是这样写的话,如果第一个 try 就找到了目标元素,下面的就不会继续执行了,而我需要继续执行下去呢

#1 楼 @xinxjxjxj 多谢你的提示,我知道该怎么做了

多谢大家的帮助,问题已经解决了

#8 楼 @xiaoafeizt
如果是要依次执行,直接用平行的 try-except 就好

try:
    driver.find_element_by_name('允许').click()
except NoSuchElementException:
    pass
try:
    driver.find_element_by_name('切换').click()
except NoSuchElementException:
    pass
try:
    driver.find_element_by_id('com.tuniu.app.ui:id/iv_close').click()
except NoSuchElementException:
    pass
try:
    driver.find_element_by_id('com.tuniu.app.ui:id/iv_style3_card_1').click()
except ...

不过这样写的话 中间有报错的会直接跳过,你的操作依赖步骤的话可能会导致后续操作失败

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册