selenium学习笔记
2022/2/7 23:15:09
本文主要是介绍selenium学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
selenium
一 安装与准备
1 pip install selenium
2 安装浏览器,下载浏览器对应的驱动
https://registry.npmmirror.com/binary.html?path=chromedriver
3 相关资料:
http://www.python3.vip/tut/auto/selenium/01/
https://www.bilibili.com/video/BV1Z4411o7TA?p=4
二 基本操作
1 浏览器
from selenium import webdriver # 创建 WebDriver 对象,指明使用chrome浏览器驱动位置 wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe') # 启动浏览器驱动与浏览器 # 设置寻找元素的最大等待时间,最大时间内周期性(每隔半秒钟)寻找该元素 wd.implicitly_wait(10) # 调用WebDriver 对象的get方法 可以让浏览器打开指定网址 wd.get('https://www.baidu.com') # 浏览器当前页面的源代码(一个或多个请求返回结果共同渲染后的前端源码) wd.page_source # 浏览器当前页面的标题 wd.title # 当前页面url wd.current_url # 设置浏览器位置相较于屏幕左上角的位置 wd.set_window_position(300, 200) # 页面刷新,模拟浏览器F5刷新 wd.refresh() # 退出,释放资源 wd.quit()
无界面浏览器
from selenium import webdriver opt = webdriver.ChromeOptions() # 创建Chrome参数配置对象 # 把Chrome设置成可视化无界面模式,windows/Linux 皆可 # opt.headless = True 或者采用下面方式 opt.add_argument('--headless') # 无界面 opt.add_argument('--disable-gpu') # 禁用gpu driver = webdriver.Chrome(executable_path=r'd:\chromedriver.exe', options=opt) # 创建Chrome无界面对象
2 选择元素的基本方法
1) 根据元素id属性选择元素
# 返回 WebElement 对象 element = wd.find_element_by_id('kw') # 获取元素 # element.send_keys("python\n") # 在元素中输入python回车,回车搜索
2) 根据元素的class属性获取元素
# 获取class名为animal的所有元素,返回一个列表 wd.find_elements_by_class_name('animal') # 列表,不存在[] # 获取第一个class名为animal的元素 wd.find_element_by_class_name('animal') # 对象,不存在异常
例子
from selenium import webdriver # 创建 WebDriver 实例对象,指明使用chrome浏览器驱动 wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe') # WebDriver 实例对象的get方法 可以让浏览器打开指定网址 wd.get('http://cdn1.python3.vip/files/selenium/sample1.html') # 根据 class name 选择元素,返回的是 一个列表 # 里面 都是class 属性值为 animal的元素对应的 WebElement对象 elements = wd.find_elements_by_class_name('animal') # 取出列表中的每个 WebElement对象,打印出其text属性的值 # text属性就是该 WebElement对象对应的元素在网页中的文本内容 for element in elements: print(element.text) # 获取元素文本内容
3)通过标签名获取元素
# 获取所有标签名为div的元素,返回列表 elements = wd.find_elements_by_tag_name('div') # 获取第一个标签名为div的元素,返回对象 element = wd.find_element_by_tag_name('div')
4) 在获取完的元素基础上继续调用前面获取元素的方法,仅查询范围有变化,用法不变
5) 获取a链接元素
# find_element_by_link_text('完整文本') wd.find_element_by_link_text('登录').click() # find_element_by_partial_link_text('部分文本内容') wd.find_element_by_partial_link_text('a标签包含的文本内容')
6) 通过名字获取元素
wd.find_element_by_name('name')
7) 其他表现形式
from selenium.webdriver.common.by import By wd.find_element(By.CLASS_NAME, 'classname') wd.find_element(By.LINK_TEXT, 'text') wd.find_element(By.TAG_NAME, 'div') ...
3 操作元素
1) 点击元素
element.click()
2) 获取元素内文本内容
element.text
3) 获取元素属性
element.get_attribute(属性名)
4) 获取元素包含的所有html内容
element.get_attribute('outerHTML')
5)获取元素内部的所有html内容
element.get_attribute('innerHTML')
6) 获取input输入框里面的文字
element.get_attribute('value')
7) 获取元素文本内容(无法用text获取时)
element.get_attribute('innerText') element.get_attribute('textContent')
8) 清除输入框中的内容
element.clear()
9) 输入框中输入内容
element.send_keys('内容')
4 CSS Selector语法选择元素
1) 基本语法
find_element_by_css_selector(CSS Selector参数) # 单个 find_elements_by_css_selector(CSS Selector参数) # 多个
通过标签获取
elements = wd.find_elements_by_css_selector('div') # 获取所有标签名为div的元素 elements = wd.find_elements_by_tag_name('div')
通过class
elements = wd.find_elements_by_css_selector('.类名')
通过id
elements = wd.find_elements_by_css_selector('#ID名')
2) 选择子元素和后代元素
# 元素1 > 元素2 获取元素2,直接子元素 wd.find_elements_by_css_selector('.类名1 > 标签2') # 获取类名1下面的所有直接子元素标签2 # 元素1 > 元素2 > 元素3... 获取某个元素,可以多级 # 元素1 元素2 获取后代元素 wd.find_elements_by_css_selector('#ID1 标签2') # 获取ID1下的所有标签2 # 可以空格和>混用 wd.find_elements_by_css_selector('#ID1 .类名2 > 标签3') # 获取ID1下的所有类名2的子元素标签3
3) 根据属性选择
# [属性=值] wd.find_elements_by_css_selector('[href="http...."]') # 获取包含指定href属性的元素 # 与基本获取方法混用 wd.find_elements_by_css_selector('div[href="http...."]') # 获取含有指定href的div元素 wd.find_elements_by_css_selector('div [href="http...."]') # 获取div下含有指定href的元素
4) 混合使用
# 组合使用 div#id.class[属性] div #id.class[属性] # 并列选取,使用逗号隔开 div, .class # 选择div和类名元素 .class div, .class span
5) 按照次序选择
# 限制:nth-child(第几个) div:nth-child(2) # 选择所有div标签下的第二个子元素 # 限制:nth-last-child(1) div:nth-last-child(1) # div下最后一个子元素 # 类型:nth-of-type(1) span:nth-of-type(2) # 选择所有标签下第二个span元素 # 类型:nth-last-of-type(2) span:nth-last-of-type(2) # 选择所有标签下最后一个span元素 # 限制:nth-child(odd) span:nth-child(odd) # 获取所有span标签下的奇数节点 # 限制:nth-child(even) span:nth-child(even) # 获取所有span标签下的偶数节点 # 限制 类型:nth-of-type-child(odd) .ID div:nth-of-type(even) # ID下获取所有偶数的div节点
6)兄弟节点
# div + div .ID + span # ID下紧跟的span元素,同一级 # div ~ div .ID ~ span # ID下所有的span
5 frame或iframe元素,操作嵌套的html
# 切换到frame中 wd.switch_to.frame(ID或name或element对象) # 加在查找元素之前,切换到frame中 # 切回外层 wd.switch_to.default_content() # 或者使用句柄切回外层 wd.switch_to.window(wd.window_handles[0])
6 切换窗口
current_windows = driver.window_handles # 获取当前所有的标签页的句柄的列表 wd.switch_to.window(current_windows[1]) # 传入下标切换
# 切换窗口 wd.switch_to.window(句柄) # 需要窗口的句柄 # 获取窗口的句柄 for handle in wd.window_handles: # 遍历获取的所有网页句柄 wd.switch_to.window(handle) # 切换到窗口 if 需要的字段 in wd.title: break # 当前handle为所需的句柄 # 保存当前窗口的句柄 mainWindow = wd.current_window_handle wd.switch_to.window(mainWindow) # 切换回当前窗口
7 select下拉框选择元素
# 创建Select对象 from selenium.webdriver.support.ui import Select select = Select('传入操作的元素element') # select_by_visible_text select.select_by_visible_text('文本') # 可见文本 # select_by_value select.select_by_value('属性值') # 该文本对应得属性值 # select_by_index select.select_by_index('次序') # 该选项的次序,从1开始 # 前面加de表示不选,deselect_by_visible_text # select.deselect_all 全不选
8 其他操作 ActionChains
例如:鼠标移动到元素上
from selenium import webdriver driver = webdriver.Chrome(r'f:\chromedriver.exe') driver.implicitly_wait(5) driver.get('https://www.baidu.com/') from selenium.webdriver.common.action_chains import ActionChains ac = ActionChains(driver) # 鼠标移动到元素上 ac.move_to_element( driver.find_element_by_css_selector('[name="tj_briicon"]') ).perform() # 调用perform才会执行移动
9 冻结页面
// 在 开发者工具栏 console 里面执行如下js代码 setTimeout(function(){debugger}, 5000) // 表示在 5000毫秒后,执行 debugger 命令
10 xpath
/ 从根节点选取,或元素之间的过渡,一级一级关系 /html/body/div // 元素之间过渡,可以不是一层的上下级关系 //div .. 当前节点的父节点 //div/p/../ @ 选取属性 //div[@class='class_name']/@class 获取含class_name的标签的class名,在selenium不能写/@class,应该用get_attribute获取属性 text() 选取文本 //p[test()='哈哈']/text() # 只返回标签对象自己的内容,不会返回子级的,//p[test()='哈哈']//text() 返回所有text,包括子级的。在selenium中只能使用element.text //div[1] # 所有div标签的第一个,从1开始 //div[last()] # 最后一个, last()-1倒数第二个 //div[position()>1] # 从第二个开始 //*[@*="user"] # 第一个*表示任意节点,第二个*表示任意属性 //div/node() # 匹配任意节点,包含注释属性等 //div/node()/text()
示例
/html/body//div/../a[@href='uer']/test() //*[text()='嘿嘿']/div[last()-1]/p[2]/@id //div[1]/./../p
11 执行js
# wd.execute_script(js语句) wd.execute_script('window.scrollTo(0, {})'.format(500)) # 每次滚轮滑动500
12 获取cookie,删除
# 获取当前标签页的全部cookie信息,列表嵌套字典 wd.get_cookies() # 删除一条cookie wd.delete_cookie('cookiename') # 删除所有cookie wd.delete_all_cookies()
13 显示等待
from selenium.webdrive.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdrive.common.by import By WebDriverWait(wd, 20, 0.5).until( expected_conditions.presence_of_element_located( (By.CLASS_NAME, 'classname') ) )
14 使用代理ip
from selenium import webdriver options = webdriver.ChromeOptions() # 使用代理ip options.add_argument('--proxy-server=http://202.2016.82:9527') driver = wevdriver.Chrome(chrome_options=options)
15 替换user-agent
from selenium import webdriver options = webdriver.ChromeOptions() # 替换User-Agent options.add_argument('--user-agent=Mozillia/5.0 HAHA')
这篇关于selenium学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-13怎么通过 JavaScript 或其他编程语言来实现监听屏幕高度变化功能?-icode9专业技术文章分享
- 2024-11-12聊聊我们那些年用过的表达式引擎组件
- 2024-11-12让项目数据更有说服力:五款必备数据可视化管理工具推荐
- 2024-11-12人到一定年纪,要学会远离多巴胺
- 2024-11-12解读:精益生产管理的目的是什么?如何操作?
- 2024-11-12Sku预研作业
- 2024-11-12文心一言API密钥:分步申请指南
- 2024-11-12初学者指南:轻松掌握后台交互
- 2024-11-12从零开始学习:封装基础知识详解
- 2024-11-12JSON对象入门教程:轻松掌握基础用法