Appium python 如何写扩展方法?想把 click 之后的等待封装一下

luoxi001713 · 2016年05月11日 · 最后由 jacexh 回复于 2016年06月02日 · 1447 次阅读

因为很多 click 之后跳转需要等待,目前的代码是,
self.driver.btn_new.click()
time.sleep(2)

能否做一个类似 click_wait() 的方法,然后调用的话直接如下?不想在 appium 系统的.py 下直接增加,有没有办法?
self.driver.btn_new.click_wait()

共收到 13 条回复 时间 点赞

应该是在 appoium 的文件里面加一个方法吧?我也想过这么弄,click 和滑动里面加截图

把 click 之后再 webdriverwait 就可以了

#1 楼 @kesha0 c# 是可以写扩展方法,python 语法这块我不太深入,不知道应该怎么做,不想在原文件里改

你的需求有点像装饰器

恩,用装饰器,把 api 都重新封一遍

出发点不太对,首先当你 click 以后,不是硬伤的情况下最好不要有任何线程等待。
治本解决方案:

  • 使用隐式等待:setup 处加上一句self.driver.implicitly_wait(10)即可。写脚本步骤时就别带有 time.sleep 了。

治标解决方案:

  • 封装 click 方法...python 开发基础....
# 点击button
def click_button(self, elname, tk=1):
    el = self.dr.find_element_by_xpath("//UIAButton[@name='%s']" % elname)
    el.click()
    tk = int(tk)
    sleep(tk)

楼主要的是点击 click 之后执行下一步的时候进行智能等待,发现元素了就再去执行方法,没发现元素就等待。不知道我有没有理解错误,如果我没有理解错误,我的实现方案是这样的:

from selenium.webdriver.support.ui import WebDriverWait

def find_element(self, *loc):
        """
        定位元素,定位正确后返回元素的信息,外部调用传入元组参数必须有*,
        例如:
        find_element(*self.native_caixun)

        :param loc: 元组类型,结构必须是(By.NAME, u'财讯')
        :return: element
        """
        try:
            element = WebDriverWait(self.driver, 30).until(lambda x: x.find_element(*loc))
            return element
        except NoSuchElementException, e:
            print 'Error details :%s' % (e.args[0])

    def find_elements(self, *loc):
        """
        定位元素,定位正确后返回元素的信息,外部调用传入元组参数必须有*,
        例如:
        find_elements(*self.native_caixun)

        :param loc: 元组类型,结构必须是(By.NAME, u'财讯')
        :return: elements
        """
        try:
            # return self.driver.find_elements(*loc)
            elements = WebDriverWait(self.driver, 10).until(lambda x: x.find_elements(*loc))
            return elements
        except NoSuchElementException, e:
            print 'Error details :%s' % (e.args[0])

这样执行的好处就是每次找元素的时候都会智能等待 30 秒。超过 30 秒则超时报错。下面是我自己封装的方式:

def clickHangQing(self):
        """
        点击导航栏的行情按钮
        :return: None
        """
        self.find_element(*self.native_hangqing).click()

    def clickEditSelect(self):
        """
        点击编辑自选,进入编辑自选页面
        :return: None
        """
        self.find_elements(*self.edit_select)[0].click()

    def clickFindStock(self):
        """
        点击放大镜,进入查询自选股界面
        :return: None
        """
        self.find_elements(*self.edit_select)[1].click()

这样实现起来就无需考虑网络等原因造成的不必要的硬等待,都会智能等待 30 秒。

#8 楼 @wyb199026 你好 有么有碰到过,find 成功,但还是 click 失败,好像元素找到,但页面没有显示或者加载

#10 楼 @pacerron 这个加等待就行了,或者在 setup 里加上一句

self.driver.implicitly_wait(10)

#10 楼 @pacerron 额,这个问题我暂时没有遇到过哦,如果隐士等待不行的话,可以试试显式等待。

等待退出的条件是什么? 你这个没有讲明白
最简单的方式应该是实现一个装饰器

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