每日分享:
我知道你最近很累,是那种看不见的身体上和精神上的疲惫感,但是,请你一定要坚持下去,就算无人问津也好,技不如人也罢,千万不要让烦躁和焦虑,毁了你本就不多的热情和定力,别贪心,我们不可能什么都有,也别灰心,我们不可能什么也没有。
- 掌握selenium控制标签页的切换
- 掌握selenium控制iframe的切换
- 掌握利用selenium获取cookie的方法
- 掌握手动实现页面等待
- 掌握selenium控制浏览器执行js代码的方法
一、selenium标签页的切换
当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换
- 获取所有标签页的窗口句柄
- 利用窗口句柄字切换到句柄指向的标签页
- 窗口句柄:指向标签页对象的标识
from selenium import webdriver url = 'https://jn.58.com/' driver = webdriver.Chrome() driver.get(url) # 输出当前网址 print(driver.current_url) # 输出句柄 print(driver.window_handles) el = driver.find_element('xpath', '/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a') el.click() # 点击后输出网址和句柄 print(driver.current_url) print(driver.window_handles)
结果:
可以发现,点击前后,网址是一样的,要想对点击后的页面进行操作,必须通过句柄来切换操作页。
from selenium import webdriver url = 'https://jn.58.com/' driver = webdriver.Chrome() driver.get(url) print(driver.current_url) print(driver.window_handles) el = driver.find_element('xpath', '/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a') el.click() # 句柄切换标签页 driver.switch_to.window(driver.window_handles[-1]) print(driver.current_url) print(driver.window_handles) el_list = driver.find_elements('xpath', '/html/body/div[6]/div[2]/ul/li/div[2]/h2/a') print(len(el_list))
结果:
我们可以看到网址变了,并且可以获取新网站上的内容。
二、switch_to切换frame标签
iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是driver.switch_to.frame(frame_element)
代码如下:
from selenium import webdriver url = 'https://qzone.qq.com/' driver = webdriver.Chrome() driver.get(url) el_frame = driver.find_element('xpath', '//*[@id="login_frame"]') # driver.switch_to.frame():也可以直接填对应的id值 # driver.switch_to.frame('login_frame') driver.switch_to.frame(el_frame) driver.find_element('id', 'switcher_plogin').click() driver.find_element('id', 'u').send_keys('你的账号') driver.find_element('id', 'p').send_keys('你的密码') driver.find_element('id', 'login_button').click()
三、selenium对cookie的处理
selenium能够帮助我们处理页面中的cookie,比如获取、删除
3.1 获取cookie
driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用,需要转换为name、value作为键值对的cookie字典
from selenium import webdriver url = 'http://baidu.com' driver = webdriver.Chrome() driver.get(url) # print(driver.get_cookies()) # cookies = {} # for cookie in driver.get_cookies(): # cookies[cookie['name']] = cookie['value'] # print(cookies) # 字典推导式,把cookie转换为字典 driver.get_cookies():获取当前标签页全部cookie信息 cookies = {cookie['name']: cookie['value']for cookie in driver.get_cookies()} print(cookies)
3.2 删除cookie(不常用)
删除一条cookie
driver.delete_cookie("Cookie_name")
删除所有cookie
driver.delete_all_cookies()
四、selenium控制浏览器执行js代码
selenium可以让浏览器执行我们规定的js代码
目标:下滑并点击隐私声明(用xpath可以找到“隐私声明”这个元素,但如果要对其进行点击操作,需要先下滑页面至页面内有“隐私声明”这个元素之后才可以点击)
代码:
from selenium import webdriver url = 'https://jn.lianjia.com/' driver = webdriver.Chrome() driver.get(url) # 向下滑动2000px js = 'scrollTo(0, 2000)' # 执行js代码 driver.execute_script(js) driver.find_element('xpath', '/html/body/div[11]/div/div[1]/div[1]/ul/li[4]/a').click()
五、页面等待
页面加载出来的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素可能还没加载出来,是不可见的,如何处理这种情况
- 页面等待分类
- 强制等待介绍
- 显示等待介绍
- 隐式等待介绍
- 手动实现页面等待
5.1 页面等待的分类
- 强制等待
- 隐式等待
- 显示等待
5.2 强制等待(了解)
time.sleep()
缺点:不智能,设置的时间太短,元素还没有加载出来;设置时间太长则会浪费时间。
5.3 隐式等待
- 隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果成功了,就进行下一步
- 在设置的时间内没有定位成功,则会报超时加载
from selenium import webdriver driver = webdriver.Chrome() # 最多等10秒 driver.implicitly_wait(10) driver.get('https://www.baidu.com') driver.find_element('xpath', '//*[@id="lg"]/map/are')
5.4 显示等待(了解)
- 每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码
- 如果没有达成成就继续等待直到超过规定时间后,报超时异常
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com') # 显式等待 WebDriverWait(driver, 20, 0.5).until( EC.presence_of_element_located((By.LINK_TEXT, '好123'))) # 参数20表示最长等待20秒 # 参数0.5表示0.5秒检查一次规定的标签是否存在 # EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签 # 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常 print(driver.find_element_by_link_text('好123').get_attribute('href')) driver.quit()
5.5 手动实现页面等待
在了解隐式等待和显示等待以及强制等待后,我们发现并没有一种通用的方法来解决页面等待的问题。
import time from selenium import webdriver driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver') driver.get('https://www.taobao.com/') time.sleep(1) # i = 0 # while True: for i in range(10): i += 1 try: time.sleep(3) element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a') print(element.get_attribute('href')) break except: js = 'window.scrollTo(0, {})'.format(i*500) # js语句 driver.execute_script(js) # 执行js的方法 driver.quit()
相关文章:
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试