呜呼~~~
疑惑解答完了好兴奋,虽然只是一个简简单单的练习,但却出现了千奇百怪的错误。
这个错误真实太刻骨铭心了,原来就是页面没有加载完成,导致我后续的元素找不到。
下面来记录下我学习中所遇到的疑惑以及解决方法。= =
还是那个百度首页下的搜索设置。
代码如下:
1 #coding=utf-8 2 from selenium import webdriver 3 import time,os 4 dr=webdriver.Chrome() 5 dr.get("http://www.baidu.com") 6 time.sleep(3) 7 #定位到搜索设置 8 e=dr.find_element_by_xpath("//div[@id='u1']//a[@class='pf']") 9 e.click() 10 print "111111111" 11 dr.find_element_by_xpath("//div[@id='wrapper'][@style='display: block;']//a[text()='搜索设置']").click() 12 print "我定位到搜索下的搜索设置了" 13 dr.find_element_by_xpath("//li[@data-tabid='general']") 14 print "我定位到搜索设置标签" 15 dr.find_element_by_xpath("//table[@id='gxsz']") 16 print "aaaaaaaa" 17 dr.find_element_by_xpath("//option[@value='50']").click() 18 print "haha111111111111111" 19 time.sleep(10) 20 dr.quit()
报错信息与浏览页停留页面
当时的思路以及想法:
最初,代码运行后的浏览器页面一直停留在搜索设置页面,从没想过是因为页面没有加载完成所导致的。加上代码报错停留在xpath那行,所以我一直死死纠缠觉得是xpath定位不对。xpath的域我写的是最广的,还是定位不到。之后我开始往别的方向想,是不是页面中有iframe呢?查询过后html中并不存在iframe,一个小小的下拉框为什么定位不到呢?我开始在每一个定位下写断言,还是不对,页码执行到xpath那就over了。接下来开始在每一句断言后加sleep,就这样突然成功了。真是amazing~~~
so,小伙伴们,在今后的练习中,一定要记住,等页面加载完成后再继续下面的操作哟~~~
接下来来解释等待页面加载的3中方式:
1.sleep()强制等待,不管你浏览器是否加载完了,程序都得等待3秒(不推荐使用)
2 from selenium import webdriver 3 import time,os 4 dr=webdriver.Chrome() 5 dr.get("http://www.baidu.com") 6 time.sleep(3) 7 dr.find_element_by_xpath("//div[@id='u1']//a[@class='pf']").click() 8 print "111111111" 9 dr.find_element_by_xpath("//div[@id='wrapper'][@style='display: block;']//a[text()='搜索设置']").click() 10 print "我定位到搜索下的搜索设置了" 11 time.sleep(10) #下面的页面是点击了搜索下的搜索设置才出来的弹窗,所以我们在这里设置sleep 12 dr.find_element_by_xpath("//li[@data-tabid='general']") 13 print "我定位到搜索设置标签" 14 dr.find_element_by_xpath("//table[@id='gxsz']") 15 print "aaaaaaaa" 16 dr.find_element_by_xpath("//option[@value='50']").click() 17 print "haha111111111111111" 18 time.sleep(10) 19 dr.quit()
2.implicitly_wait(xx)隐形等待。隐性等待对整个driver的周期都起作用,所以只要设置一次即可
1 #coding=utf-8 2 from selenium import webdriver 3 import time,os 4 dr=webdriver.Chrome() 5 dr.get("http://www.baidu.com") 6 time.sleep(3) 7 dr.find_element_by_xpath("//div[@id='u1']//a[@class='pf']").click() 8 print "111111111" 9 dr.find_element_by_xpath("//div[@id='wrapper'][@style='display: block;']//a[text()='搜索设置']").click() 10 print "我定位到搜索下的搜索设置了" 11 dr.implicitly_wait(10) #下面的页面是点击了搜索下的搜索设置才出来的弹窗,所以我们在这里设置 12 dr.find_element_by_xpath("//li[@data-tabid='general']") 13 print "我定位到搜索设置标签" 14 dr.find_element_by_xpath("//table[@id='gxsz']") 15 print "aaaaaaaa" 16 time.sleep(3) 17 dr.find_element_by_xpath("//option[@value='50']").click() 18 print "haha111111111111111" 19 time.sleep(10) 20 dr.quit()
3. WebDriverWait显性等待。
WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
该代码参考:http://mp.weixin.qq.com/s?__biz=MzI0NDQ5NzYxNg==&mid=2247483714&idx=1&sn=c83257471a39338c0fb16cf6dea768c7&chksm=e95dacfdde2a25eb7d2461a05784d1b9ba0d10d8ea6b9076ba56aabda84d80ab15eeeb43d405&mpshare=1&scene=23&srcid=032286RFHMnfCjNx4dDx9paV#rd
1 #_*_ coding:utf-8 _*_ 3 from selenium import webdriver 4 from selenium.webdriver.support.wait import WebDriverWait 5 from selenium.webdriver.support import expected_conditions as EC 6 from selenium.webdriver.common.by import By 7 if __name__ == '__main__': 8 driver=webdriver.Chrome() 9 driver.implicitly_wait(10) 10 11 driver.get('http://www.testingunion.com') 12 locator = (By.LINK_TEXT,u'webdriver') 13 try: 14 # 在最长20s内,每个0.5秒去检查locator是否存在,如果存在则进入下一步 15 WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) 16 # 提取该文本对应的url,并打印出来 17 print driver.find_element_by_link_text(u'webdriver').get_attribute('href') 18 finally: 19 print u"异常了" 20 driver.quit()