python之selenium

179 阅读4分钟

安装

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    选择所有的divh1   ,并集选择器
//*[@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()

参考

juejin.cn/post/695575…