安装
pip install selenium
下载chromedriver
- 这里我将谷歌驱动放在D盘根目录下,地址为D:\chromedriver_win32\chromedriver.exe
这个地方使用的版本与自己谷歌浏览器的版本一致,我的浏览器版本是96.0.4664.110,所以要下载对应的 chromedriver版本为96.0.4664.xxx,不同版本没验证过行不行,有兴趣的可以自行尝试,按理说大版本一样就行
导入所需依赖
from selenium.webdriver.common.action_chains import ActionChains //其他操作时用到,如鼠标移动
from selenium.webdriver.support.ui import Select //操作select标签时用到
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
选择器
find_elements 返回数组,可用于判断是否存在,可用for in 遍历
find_element 返回查找到的第一个标签,如不存在则报错
wd.implicitly_wait(10)
//设置完这个之后,后面的程序如果没有找到元素,则会每隔半秒重新查找,
//直到设置的最高时间10秒,find_elements返回空数组,find_element抛出异常
wd.current_window_handle //获取当前窗口句柄
wd.window_handles //获取当前浏览器的所有窗口句柄
wd.switch_to.window(n[-1]) //切换到第一个窗口
wd.switch_to.frame(frame的id值或者name值或者element对象)
//切换到iframe窗口内,element对象:wd.find_elements(By.CSS_SELECTOR,'iframe')
wd.switch_to.default_content() //从frame窗口切回到正常的浏览器窗口
wd.execute_script("scroll(0,1000000)") 滚动到100000的位置
wd.find_elements(By.ID,'container') //查找id为container的标签
wd.find_elements(By.CLASS_NAME,'red') //查找class为red的标签
wd.find_elements(By.TAG_NAME,'h1') //查找标签名为h1的标签
wd.find_elements(By.CSS_SELECTOR,'#container') //css选择器,可以是标签名、类名、id
wd.find_elements(By.CSS_SELECTOR,'#container .test input[disabled]')
//复合写法,指的是id为container下面的类名为test下面的带有disabled属性的input标签
- 空格是后台选择器
- >是子代选择器
- , 是并集选择器
- :nth-child(1) 选择
第一个节点 - :nth-last-child(1) 选择
倒数第一个节点 - span:nth-of-type(1) 选择
span类型的第一个 - :nth-child(odd) 选择
奇数 - :nth-child(even) 选择
偶数 - div + span div的所有
兄弟span - a[href*='xxx'] 查找href包含xxx的a节点
- a[href^='xxx'] 查找href开头是xxx的a节点
- a[href$='xxx'] 查找href结尾是xxx的a节点
xpath
/ 代表根元素,如/html
// 代表全局,如//div 查找出所有的div
* 通配符
[@属性名="属性值"] 根据属性,引号一定要有
[contains(@style,'color')] 查找style带有color的标签
[starts-with(@style,'color')] 查找style开头是color的标签
[ends-with(@style,'color')] 查找style结尾是color的标签
p[2] 选择第二个p
p[last()] 最后一个p
p[last()-1] 倒数第二个,以此类推
p[position()<=2] 选择前两个p
p[position()>=last()-2] 选择后三个p
//div|//h1 选择所有的div和h1 ,并集选择器
//*[@id='china']/.. 选择id=china的父节点
/following-sibling::* 选择所有后续兄弟节点
/preceding-sibling::* 选择所有前面兄弟节点
dom.find_element(By.XPATH,'.//p') 从webElement中查找所有p元素 记住前面有个点
dom操作
time.sleep(2) //页面睡眠2秒
dom.get_attribute('value') //获取标签属性值,可用于获取input的value值
dom.get_attribute('outerHTML')//获取整个dom节点
dom.get_attribute('innerHTML')//获取整个dom节点的内部节点
dom.get_attribute('innerText')//获取文本内容
dom.text //获取文本内容
Select(dom).select_by_value('apple') //选择select选择器value为apple这一项
Select(dom).select_by_index(1) //选择select选择器的第一项
Select(dom).select_by_visible_text('apple') //选择select选择器文本为apple这一项
Select(dom).deselect_by_value('apple') //不选择select选择器value为apple这一项
Select(dom).deselect_by_index(1) //不选择select选择器的第一项
Select(dom).deselect_by_visible_text('apple') //不选择select选择器文本为apple这一项
Select(dom).deselect_all()//都不选
dom.send_keys('百度\n') //设置输入框的值,对disabled不生效
dom.click() //点击事件
wd.close() //关闭窗口
wd.quit() //关闭窗口,并关闭驱动
其他操作
ac=ActionChains(wd) 先实例化
ac.move_to_element(dom).perform() //鼠标移动到元素
ac.click().perform() //鼠标模拟点击
ac.double_click().perform() //鼠标模拟双击
...//更多鼠标相关操作都在ac对象中,要记住的是必须后面调用perform方法
冻结界面
控制台输入 setTimeout(()=>{debugger},3000) //用debugger可以用来查看光标移出后会消失的dom元素
原生弹出框操作
//alert confirm prompt
alert=wd.switch_to.alert
alert.accept() //点击弹框确认按钮
alert.dismiss() //点击弹框取消按钮
alert.text //获取弹框内容
alert.send_keys('1321321') //往prompt的输入框添加
示例代码
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
s = Service(r'D:\chromedriver_win32\chromedriver.exe')
wd = webdriver.Chrome(service=s)
wd.get('https:www.baidu.com')
dom=wd.find_element(By.CSS_SELECTOR,'.title-content-title')
time.sleep(1)
dom.click()
n=wd.window_handles
wd.switch_to.window(n[-1])
time.sleep(1)
wd.find_element(By.CSS_SELECTOR,"[tabindex='0']").click()