官网(https://selenium-python.readthedocs.io/)
selenium原理
- 对于每一个selenium脚本,一个http请求会被创建并且发送给浏览器的驱动(即chromeDriver.exe)。
- 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
- HTTP Server 接收到请求后根据请求来具体操纵对应的浏览器
- 浏览器执行具体的测试步骤,并将步骤结果返回给HTTP Server
- HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息
- 因为HTTP协议是一个浏览器和WEB服务器之间通信的标准协议,几乎每一种编程语言都提供了丰富的http libraries,这样就可以方便的处理客户端Client和服务器Server之间的请求request及响应response
- WebDriver的结构就是C/S结构,WebDriver API相当于是客户端,而浏览器驱动是服务端
- WebDriver基于的协议是 JSON Wire protocol,这个协议是在http协议的基础上,对http请求及响应的数据做了进一步的规范。在Client和Server之间,只要是基于 JSON Wire protocol 来传递数据,就与具体的脚本语言无关了。
安装
pip install selenium
浏览器
- selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
from selenium import webdriver
browser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()
browser=webdriver.Edge()
- 浏览器初始化设置(Chrome浏览器为例)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手动指定使用的浏览器位置
driver=webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.baidu.com')
print('hao123' in driver.page_source)
driver.close() #切记关闭浏览器,回收资源
基本使用
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By # 选择器
from selenium.webdriver.common.keys import Keys # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素
browser=webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('selenium')
input_tag.send_keys(Keys.ENTER) #输入回车
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等到id为content_left的元素加载完毕,最多等10秒
print(browser.page_source)
print(browser.current_url)
print(browser.get_cookies())
finally:
browser.close()