我们在前面遇到过定位元素时元素还未载入成功,然后定位失败的情况,当这种情况时,我们需要等待元素出现。可以用4种方法
1、强制等待
所谓强制等待就是直接sleep,代码如下
import time
time.sleep(10)
强制等待存在几个问题
- 无论后面步骤元素是否可以定位,都必须等待设置的时间,非常影响自动化测试的效率
- 时间长短不好把握,设长了影响测试的效率,设短了可能元素还未载入成功,导致执行失败
所以一般不建议使用强制等待
2、隐式等待implicitly_wait()
隐式等待的方法是全局设置,存货与webdriver对象的生命周期,设置代码如下
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
driver.implicitly_wait(10)
隐式等待是在定位元素时,等到页面所有元素都加载成功后才执行下一步,如果超时时间未定位到元素则抛异常。
隐式等待也存在一些问题
- 当定位的元素已经出来时,页面元素未加载成功,还是会一直等待,影响测试效率
- 抛的异常无法自己设置(如下为关键异常信息),不容易看出是什么元素出问题
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.
3、用wait_activity()等待页面出现
当操作为一个元素下一个元素迟迟不出现的情况肯定是切好页面了,所以也可以用wait_activity()来等待预期出现的activity出现后再做下一步元素定位操作。
示意代码如下
#点击记一笔按钮
#time.sleep(5)
add_trans_btn = driver.find_element(AppiumBy.ID,"com.mymoney:id/add_trans_btn")
print("add_trans_btn 的文本是,",add_trans_btn.text)
add_trans_btn.click()
#上述操作后跳转到新的activity,com.mymoney.biz.addtrans.activity.AddTransActivityV12
#等待页面出现
driver.wait_activity(“com.mymoney.biz.addtrans.activity.AddTransActivityV12”)
此方法也有一些问题
- 需要知道操作后下一个activity的名字,操作起来耗费时间
- 有时候activity虽然出现了,可是我们要定位的元素还是没载入成功,最后还是会失败
4、显示等待WebDriverWait()
WebDriverWait()可以应用到确切的元素,而且可以设置抛出异常的类型和抛出异常的消息,方便进行定位
WebDriverWait需要配合until或until_not使用,until用于等待元素出现,until_not用于等待元素消失。
WebDriverWait需要通过“from selenium.webdriver.support.wait import WebDriverWait”引用。
参数说明:
- driver:浏览