Selenium 设置元素等待的三种方式
1. sleep 强制等待
2. implicitly_wait() 隐性等待
3. WebDriverWait()显示等待

三种方式的优缺点

1. sleep 强制等待

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
sleep(2)        #设置等待2秒钟
driver.get('http://www.baidu.com')


优点
代码简介,简单明了
缺点
如果设置sleep等待时间过短,元素还没加载出来,程序报错,sleep设置等待时间过长,元素早就加载出来了,程序还在等待,浪费是时间,影响代码整体的运行效率
个人看法
简单粗暴,根据网站的响应速度和自己的网速来设置合理的休眠时间

2. implicitly_wait() 隐性等待

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(20)  #设置等待20秒钟
driver.get('http://www.baidu.com')


优点
1.代码简介
2.在代码前部分加implicitly_wait(10) ,整个的程序运行过程中都会有效(作用于全局,直接在初始化driver的后面加,后面的代码都会受影响),都会等待元素加载完成
3.在设置的时间内没有加载到整个页面,则会报NosuchElementError。如果元素在第10s被加载出来,自动执行下面的脚本,不会一直等待10s
缺点
1. 非要加载到整个页面才执行代码,这样影响代码的执行效率,一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。
个人看法
1.不适合用在数据在ajax的网站中,比如翻页什么的,某个元素一直存在,但是数据一直在变,这样的话只要加载出来第一页,后面翻页的数据全部会和第一页的数据相同,因为代码判断了这个元素已经被加载出来了,不会等ajax去加载

3. WebDriverWait()显示等待

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait       #WebDriverWait注意大小写
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
    element = 
    WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
    element.send_keys('123')
    driver.find_element_by_id('su').click()
except Exception as message:
   print('元素定位报错%s'%message)
finally:

    优点
           代码执行效率快。无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行代码。是最智能的设置元素等待的方式。
    缺点
           1.要导入from selenium.webdriver.support import expected_conditions as EC
            from selenium.webdriver.support.ui import WebDriverWait
            from selenium.webdriver.common.by import By
            必须要导入以上3个包,导包路径相当的复杂,啰嗦而且麻烦
           2.写等待时间的代码也是复杂。步骤稍微有点多。
                element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘kw’)))
                element.send_keys(‘123’)
     个人看法: 相比于两种,这种方式可以算的上好的了,但是就是麻烦,写的代码太多,使用的话可以和第一种方式sleep混合使用,不过我还是喜欢用sleep,本身使用selenium就是没办法破开网站,或者使用selenium比直接破解的方式更好才使用这种,我个人是能不用就不用,抓取速度太慢了。

附上我抓取一个网站的代码,这网站作者的成果抓不到,只好用这种方式来抓了:

from selenium import webdriver
import time
from lxml.html import etree
import copy
import json
from selenium.webdriver.common.by import By
from  selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def getAuthors():
    j1 = set()
    f = open('Author.json', 'r', encoding='utf-8')
    data = f.read()
    data_list = data.split('\n')
    for dt in data_list:
        j1.add(dt)
    f.close()
    print('j1= ', len(j1))
    j2 = set()
    f1 = open('yzq.json', 'r', encoding='utf-8')
    data1 = f1.read()
    data_list1 = data1.split('\n')
    for dt in data_list1:
        j2.add(dt)
    print('j2= ', len(j2))
    countSet = j1 - j2
    print('countset= ', len(countSet))
    AuthorsData = []
    for dt in countSet:
        dt_json = json.loads(dt)
        if int(dt_json["成果"]) > 0:
            AuthorsData.append(dt_json)
    # dt = {'img': 'https://www.scholarmate.com/avatars/99/92/62/37572.jpg', 'name': '吴伟',
    #       'url': 'https://www.scholarmate.com/P/aeiUZr', 'org': '复旦大学, 教授', '项目': 20, '成果': 234, 'H指数': '24'}
    print('AuthorData= ', len(AuthorsData))
    return AuthorsData
def parseHtml(html, i):
    temp_list = []
    html_data = etree.HTML(html)
    project_html = html_data.xpath('//div[@class="pub-idx__main"]')
    for p in project_html:
        # pro_name = p.xpath('./div[@class="pub-idx__main_title"]/a/@title')[0]
        pro_name = p.xpath('.//a/@title')[0].strip().replace(r'\xa0', '')
        # pro_url = p.xpath('./div[@class="pub-idx__main_title"]/a/@href')[0]
        pro_url = p.xpath('.//a/@href')[0]
        pro_author = p.xpath('./div[2]/@title')[0].strip().replace('\xa0', '')
        # pro_author = p.xpath('.//div[@class="pub-idx__main_author"]/@title')
        pro_inst = p.xpath('./div[3]/@title')[0]
        temp_dict = {
            'num': i,
            'pro_name': pro_name,
            'pro_url': pro_url,
            'pro_author': pro_author,
            'pro_inst': pro_inst
        temp_list.append(copy.deepcopy(temp_dict))
    return temp_list
def parseData(author_data):
        url = author_data['url']
        ach_num = int(author_data['成果'])
        pages = ach_num // 10
        pages_ys = ach_num % 10
        if pages_ys > 0:
            pages += 1
        driver = webdriver.Chrome()
        # driver.implicitly_wait(10)
        driver.get(url)
        psn_data = []
        for i in range(1, pages+1):
            if i == 1:
                # 防止抓取到半路的时候页面没有响应,这部分数据就直接扔掉
                    # time.sleep(2)
                    driver.find_element_by_xpath('//*[@id="pubTab"]').click()
                    # time.sleep(3)
                    # 有以下这些选择
                    # WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'pub-idx__main')))
                    # WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'pub-idx__main')))
                    # WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, './/pub-idx__main')))
                    # 这个也不适合这个网站,还是会抓到重复的
                    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//div[@class="pub-idx__main"]')))
                    html = driver.page_source
                    temp_dict = parseHtml(html, i)
                    psn_data.append(copy.deepcopy(temp_dict))
                except:
                    import traceback
                    print(traceback.print_exc())
            else:
                # driver.find_element_by_xpath('//*[@id="pubTab"]').click()
                # 将页面拉到底部
                    js = "var q=document.documentElement.scrollTop=100000"
                    driver.execute_script(js)
                    # time.sleep(1)
                    driver.find_element_by_xpath('//div[@class="pagination__pages_next"]').click()
                    # time.sleep(2)
                    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//div[@class="pub-idx__main"]')))
                    html = driver.page_source
                    temp_dict = parseHtml(html, i)
                    psn_data.append(copy.deepcopy(temp_dict))
                except:
        driver.close()
        psn_data = {
            'init_data': author_data,
            'psn_data': psn_data
        print(psn_data)
        psn_data_string = json.dumps(psn_data, ensure_ascii=False)
        with open('data.json', 'a+', encoding='utf-8') as f:
            f.write('{}\n'.format(psn_data_string))
        author_data_string = json.dumps(author_data, ensure_ascii=False)
        with open('yzq.json', 'a+', encoding='utf-8') as f:
            f.write('{}\n'.format(author_data_string))
    except:
        # import traceback
        # print(traceback.print_exc())
        # au_strign = json.dumps(author_data, ensure_ascii=False)
        # author_data_string = json.dumps(au_strign, ensure_ascii=False)
        # with open('error.json', 'a+', encoding='utf-8') as f:
        #     f.write('{}\n'.format(author_data_string))
def main():
    # authors的值:给出三条
    # {"img": "https://www.scholarmate.com/avatars/e4/fe/1e/1000002077830.png?A=DMkT", "name": "胡婷",
    #  "url": "https://www.scholarmate.com/P/QFFbae", "org": "四川大学, 主治医师", "项目": "0", "成果": "11", "H指数": "0"}
    # {"img": "https://www.scholarmate.com/avatars/01/ea/59/1000002180047.png?A=DVUy", "name": "白晓涓",
    #  "url": "https://www.scholarmate.com/P/73me22", "org": "", "项目": "6", "成果": "8", "H指数": "0"}
    # {"img": "https://www.scholarmate.com/avatars/fe/0d/89/1000000732306.png?A=D65r", "name": "原鹏飞",
    #  "url": "https://www.scholarmate.com/P/77nIFr", "org": "国家统计局统计科学研究所, 副研究员", "项目": "0", "成果": "90", "H指数": "0"}
    AuthorsData = getAuthors()
    for authors in AuthorsData:
        print('author= ', authors)
        parseData(authors)
if __name__ == '__main__':
    main()

   友情链接:

            https://www.cnblogs.com/zhaof/p/6953241.html

            https://blog.csdn.net/xiezhiming1234/article/details/83865314

           https://www.cnblogs.com/April-Chou-HelloWorld/p/8855760.html

Selenium 设置元素等待的三种方式 1. sleep 强制等待 2. implicitly_wait() 隐性等待 3. WebDriverWait()显示等待三种方式的优缺点1. sleep 强制等待 from selenium import webdriverfrom time import sleepdriver = webdr... driver.implicitly_wait(20) # 设置全局元素等待超时时间20秒 #设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步,超出设置的时长20秒还没有定位到元素,则抛出异常。 缺点:程序会一直等待整个页面加载完成, 2- 隐式等待:implicitly_wait() 3- 显示等待:WebDriverWait() (1)与until()或者until_not()方法结合使用 (2)WebDriverWait与expected_conditions结合使用 (3)显示等待,自定义等待条件 强制等待:sleep() import time sleep(5) #等待5秒 设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点:不智能
web.implicitly_wait(),隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载。 缺点是不智能,因为随着ajax技术的广泛应用,页面的元素往往都可以时间局部加载,也就是在整个页面没有加载完的时候,可能我们需要的元素已经加载完成了,那就么有必要再等待整个页面的加载,执行进行下一步,而隐性等待满足不了这一点;   另外一点,隐性等待设置时全局性的,在开头设置过之后,整个的程序运行过程中都...
之前有提到过等待函数,等待函数分为:强制等待(sleep)、隐式等待(implicitly_wait),显示等待(WebDriverWait),这次以显示等待方式专门做一次总结,因为我个人是比较喜欢用这种等待方式。 2.显式等待 显示等待:指定一个等待条件(元素),在一定时间间隔内检测一次元素,程序会判断在等待时间内条件是否满足条件,如果满足则执行下一...
python driver.implicitly_wait()方法报错selenium.common.exceptions.WebDriverException: Message: invalid argument: value must be a non-negative integer 在用python selenium编写自动化测试脚本时遇到的一个坑,记录一下 在使用selenium的隐式等...
强制等待:不管浏览器元素是否加载完成,程序都得等待3秒,3秒一到,继续执行下面的代码。 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get('https://www.baidu.com') sleep(3) # 强制等待3秒再执行下一步 print(driver.title)
三种等待方式:sleep 强制等待, sleep,设置等待多长时间,就要等待多长时间。通常使用这个等待方式的场景为,静态元素的加载,不需要从服务器上请求,可以很笃定的知道,多少时间之内,这个元素肯定会加载出来。 比如百度首页的登录按钮。点击登录时,会弹出登录窗口。但这个窗口其实在访问百度首页时就已经加载好了,点击登录时,并不是从服务器上请求再加载,而是直接加载静态页面,不受网速的影响,3s之内,肯定可以加载完成: from selenium import webdriver # 导入sleep time.sleep(2) 2、隐式等待:driver.implicitly_wait(20) 设置20秒的最大等待时长,他等待的结束条件是:等待到浏览器全部加载完成为止,全部加载可以理解为,浏览器不再转圈圈。 弊端:页面的加载其实不单单是页面html,重要还有一些页面静态资源,而静态资源的加载是最耗时的,这些...