目录

等待

1 使用implicitly_wait隐式等待

2 使用WebDriverWait显式等待

3 简单粗暴的time.sleep等待

多窗口


本节中的内容比较重要。

等待

在使用selenium的过程中,如果打开了驱动窗口(也就是没有使用无头模式),你会发现很多情况下selenium打开页面的过程都需要一定的时间,特别是图片多的页面。

如果每次打开页面的时候都不加等待,很有可能会出现“获取元素失败”的错误。为了应对这样的情况,selenium内自带了很多方法,我们也可以简单的用time.sleep(s)来等待几秒钟。

1 使用implicitly_wait隐式等待

用chrome举例。

driver=webdriver.Chrome(DRIVERPATH)

driver.implicitly_wait(second) #等待加载

这个函数设置了selenium每次打开新页面的等待时间,如果在时间内页面加载完毕就直接执行下一步动作,如果等待之后还没有加载完毕也会继续操作(所以这个时间可以在容忍范围内尽可能的长)。并且,此函数在整个爬取过程中只需要设置一次。

-优点:只需要设置一次、超时不报错、时间弹性大

-缺点:每次都要等待到页面全部加载

2 使用WebDriverWait显式等待

driver=webdriver.Chrome(DRIVERPATH)

WebDriverWait(driver,second).until(EC.presence_of_element_located(ele))

在元素ele出现之前等待second秒。当然,ele可以使用By定位。

-优点:可以等待特定元素出现

-缺点:超时之后会报错

3 简单粗暴的time.sleep等待

import time

time.sleep(second)

-优点:简单粗暴

-缺点:死板

多窗口

其实就是多标签。我们平时在使用浏览器浏览网站时,时常会有新的页面跳出。对于人而言只需要点击标签就可以切换,对于selenium而言则需要额外的操作来指定其操作的标签。

driver.current_window_handle #当前的标签句柄

driver.window_handles #当前所有句柄的列表 #它按照时间排序,所以最新的标签句柄的索引应为[-1]

driver.switch_to.window(handle) #切换到handle句柄的标签

还有一种情况,那就是页面中含有iframe标签。这种情况下我们要先定位进iframe才能再进行具体元素的定位,定位进iframe的函数如下:

driver.switch_to.frame("iframe_id") #参数为此frame的id