百度“搜索设置”之等待页面加载完成的3中等待方式

呜呼~~~

疑惑解答完了好兴奋,虽然只是一个简简单单的练习,但却出现了千奇百怪的错误。

这个错误真实太刻骨铭心了,原来就是页面没有加载完成,导致我后续的元素找不到。

下面来记录下我学习中所遇到的疑惑以及解决方法。= =

还是那个百度首页下的搜索设置。

代码如下:

 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()

 

posted @ 2017-03-17 12:10  花花妹子。  阅读(916)  评论(0编辑  收藏  举报