在执行自动化脚本的时候,很多时候会遇到定位不到控件而报错,先不要急于寻求他人,先自己排除以下情况。主要有俩点原因,1.脚本运行速度比页面加载速度快 2.frame框架,第二种只要用switch_to.frame(‘默认是iframe标签的id‘)跳转到该框架,然后再进行定位操作,下面主要讲下第一种情况。
加等待时间,主要有等待方法
1.sleep() ,强制等待,图方便,很多时候采用这种方法,但是它是强制等待,如sleep(5),必须等待5秒才会进行后面的操作,不管页面有没有加载完,问题是,如果页面完全加载完时间大于5秒,也会定位不到控件,而且比较死板,不灵活,如果大量使用该方法会使脚本运行速度变慢
2.imolicitly_wait(),隐性等待,直接看代码分析
class TestLogin(unittest.TestCase): def setUp(self): print (‘start:‘) self.driver = webdriver.Firefox() self.url = ‘https://mail.tom.com/‘ self.driver.implicitly_wait(5) #此处就是隐性等待5秒 #正确用户名和密码登录 def test1(self): u‘‘‘用户名正确,密码正确‘‘‘ driver=self.driver driver.get(self.url)
标记的就是隐性等待5秒,全局都起作用,所以只要写一个就可以,隐性等待设置了一个最长的等待时间5秒,在5秒内若页面加载完成,继续下一步,否则一直等待知道满足最大时间,然后抛出异常。
注意他也有弊端,这里页面加载是直到完全加载才执行后面程序,这就导致了如果5秒内已经加载出我们想要的元素,它还会等待完全加载完才执行下一步,这也导致了脚本运行速度变慢
3.WebDriverWait(),显示等待,这里需要导入三个模块:
from selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.common.by import By
from selenium import webdriver
#例如定位百度搜索框
driver=webdriver.Chrome()
driver.get(‘www.baidu.com‘)
element=driver.find_element_by_id(‘kw)
WebDriverWait(driver,10).until(lambda driver:driver.find_element_by_id(‘kw))
通过匿名函数像until传入一个方法,这里千万不能直接传定位的元素对象,必须是方法,这句代码就是循环检测百度搜索框有没有出现,若在10秒内加载出现此元素,自动继续后面的操作,若没有出现,则抛异常
element.send_keys(‘test‘)
接下来是介绍通过expected_conditions类中方法来判断元素是否出现
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium import webdriver #例如定位百度搜索框 driver=webdriver.Chrome() driver.get(‘www.baidu.com‘) element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘kw‘)))
通过expeted_conditions类中方法判断元素是否出现,然后返回该元素对象,我们可以通过一个变量直接接受该变量然后进行点击,编辑。。。操作
element.send_keys(‘test‘)
expeted_conditions类中还有很多判断元素的各种条件,可以百度去看看