因为很多 click 之后跳转需要等待,目前的代码是,
self.driver.btn_new.click()
time.sleep(2)
能否做一个类似 click_wait() 的方法,然后调用的话直接如下?不想在 appium 系统的.py 下直接增加,有没有办法?
self.driver.btn_new.click_wait()
应该是在 appoium 的文件里面加一个方法吧?我也想过这么弄,click 和滑动里面加截图
把 click 之后再 webdriverwait 就可以了
你的需求有点像装饰器
恩,用装饰器,把 api 都重新封一遍
出发点不太对,首先当你 click 以后,不是硬伤的情况下最好不要有任何线程等待。
治本解决方案:
self.driver.implicitly_wait(10)
即可。写脚本步骤时就别带有 time.sleep 了。治标解决方案:
# 点击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 失败,好像元素找到,但页面没有显示或者加载
等待退出的条件是什么? 你这个没有讲明白
最简单的方式应该是实现一个装饰器