zoukankan      html  css  js  c++  java
  • 百度“搜索设置”之等待页面加载完成的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()
  • 相关阅读:
    Vue2.0 $set()的正确使用方式
    Vue中axios踩坑之路-POST传参
    vue里使用create、mounted调用方法的正确姿势
    cmd返回上一级和根目录
    【积累】排序题积累
    【图论】2019 ICPC Malaysia National G(拓扑排序)
    2019 ICPC Malaysia National F(状态压缩)
    【线段树】扫描线学习笔记
    组合数(阶乘数质因子分解)
    【线段树】2019CCPC网络选拔赛 array(权值线段树)
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/6565271.html
Copyright © 2011-2022 走看看