相信好多同学可能遇到或者本就知道,在脚本运行过程中,经常会出现操作冲突,即上个动作还未完成,下个动作就已经触发,导致元素无法识别,出现类似 no such element的错误,那我们要怎么避免这些问题呢,废话不多说,搞起来~
一、举个栗子
我们打开百度,在搜索框输入“fuck_test”,点击搜索,然后立马点击之后页面上的搜索工具元素,此时,我们成功的制造了我们想要的异常~
代码:
#encoding=utf-8
from selenium import webdriver
import time
fuck_test=webdriver.Chrome()
fuck_test.get("https://www.baidu.com")
fuck_test.find_element_by_id("kw").send_keys("fuck_test")
fuck_test.find_element_by_id('su').click()
fuck_test.find_element_by_link_text(u'搜索工具').click()
现象:
二、吃了这个栗子
你应该已经才出来了,在点击了搜索按钮后,需要等待页面加载成功,才能看到搜索工具这个元素,所以(┳_┳)...
新代码:
#encoding=utf-8
from selenium import webdriver
import time
fuck_test=webdriver.Chrome()
fuck_test.get("https://www.baidu.com")
fuck_test.find_element_by_id("kw").send_keys("fuck_test")
fuck_test.find_element_by_id('su').click()
time.sleep(2)
fuck_test.find_element_by_xpath("//*[@id='container']/div[2]/div/div[2]/div").click()
新现象:
问题解决,心旷神怡~
三、多说一句
你肯定发现了,上面的等待是引入了系统包time,使用睡眠2秒等待页面加载成功,元素出现的,那么我们怎么确定这个时间呢,2秒5秒10秒,这个是不具确定性而且很死板的行为,那么有没有一种智能识别页面加载成功的方法呢?答案是:yes
上面的time.sleep(2)俗称显示等待,那么对应的就有隐式等待,又称只能等待:implicitly_wait(),他是浏览器对象的一个方法,怎么用呢?请看:
代码:
#encoding=utf-8
from selenium import webdriver
import time
fuck_test=webdriver.Chrome()
fuck_test.get("https://www.baidu.com")
fuck_test.find_element_by_id("kw").send_keys("fuck_test")
fuck_test.find_element_by_id('su').click()
#time.sleep(2)
fuck_test.implicitly_wait(10)
fuck_test.find_element_by_xpath("//*[@id='container']/div[2]/div/div[2]/div").click()
效果:
在实践过程中,明显的,智能等待的时间比显示等待的时间要快,因为这个页面的加载可能不需要2秒,只需要1秒半。
ps:智能等待方法中的10,意为最长智能等待时间,实际时间为页面加载成功所花费的时间,所以智能等待在自动化测试中的作用是很明显的,所以多用智能等待,如果出现页面动画干扰等问题的时候再选用显示等待未尝不是最好的解决方案。
ok,今天就到这,短小精悍是我们的目标,祝你看的愉快~
兄dei~如果你觉得还行,可以分享到朋友圈,大家一起学习,共同进步~
领取专属 10元无门槛券
私享最新 技术干货