selenium知识点大全
selenium知识点大全
在使用selenium之前必须先配置浏览器对应版本的webdriver。
1. 初始化浏览器对象
from selenium.webdriver import Chrome
# 创建浏览器对象,并且打开一个空的页面
browser = Chrome()
# 关闭浏览器
browser.close()
2. 访问指定网页
from selenium import webdriver
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
# 访问百度首页
browser.get(r'https://www.baidu.com/')
# 浏览器截图
browser.get_screenshot_as_file('截图.png')
# 关闭浏览器
browser.close()
3. 设置浏览器大小
from selenium import webdriver
import time
browser = webdriver.Chrome()
# 设置浏览器大小:全屏
browser.maximize_window()
browser.get(r'https://www.baidu.com')
time.sleep(2)
# 设置分辨率 500*500
browser.set_window_size(500, 500)
time.sleep(2)
# 设置分辨率 1000*800
browser.set_window_size(1000, 800)
time.sleep(2)
# 关闭浏览器
browser.close()
4. 刷新页面
from selenium import webdriver
import time
browser = webdriver.Chrome()
# 设置浏览器全屏
browser.maximize_window()
browser.get(r'https://www.baidu.com')
time.sleep(2)
try:
# 刷新页面
browser.refresh()
print('刷新页面')
except Exception as e:
print('刷新失败')
# 关闭浏览器
browser.close()
5. 前进和后退
from selenium import webdriver
import time
browser = webdriver.Chrome()
# 设置浏览器全屏
browser.maximize_window()
browser.get(r'https://www.baidu.com')
time.sleep(2)
# 打开淘宝页面
browser.get(r'https://www.taobao.com')
time.sleep(2)
# 后退到百度页面
browser.back()
time.sleep(2)
# 前进到淘宝页面
browser.forward()
time.sleep(2)
# 关闭浏览器
browser.close()
6. 获取页面基本属性
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)
7. 定位标签
browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'input')
browser.find_element(By.LINK_TEXT,'新闻')
browser.find_element(By.PARTIAL_LINK_TEXT,'闻')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')
8. get_attribute获取标签属性
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
# 通过class属性值获取标签
logo = browser.find_element(By.CLASS_NAME,'index-logo-src')
print(logo)
# 获取标签的src属性
print(logo.get_attribute('src'))
# 关闭浏览器
browser.close()
9. 获取标签内容
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
# 通过css选择器选中标签
logo = browser.find_element(By.CSS_SELECTOR, '#hotsearch-content-wrapper > li:nth-child(1) > a')
# 获取标签的标签内容
print(logo.text)
# 获取标签的href属性
print(logo.get_attribute('href'))
# 关闭浏览器
browser.close()
10. 获取其他属性
除了属性和文本值外,还有id、位置、标签名和大小等属性。
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
logo = browser.find_element(By.CLASS_NAME, 'index-logo-src')
# 获取标签的id
print(logo.id)
# 获取标签的位置
print(logo.location)
# 获取标签的标签名
print(logo.tag_name)
# 获取标签的大小
print(logo.size)
# 关闭浏览器
browser.close()
11. 页面交互操作
-
输入文本:
标签.send_keys(输入内容)
-
点击:
标签.click()
-
清空输入框:
标签.clear()
-
回车确认:
标签.submit()
-
单选:单选比较好操作,先定位需要单选的某个元素,然后点击一下即可。
-
多选:多选好像也比较容易,依次定位需要选择的元素,点击即可。
-
下拉框:下拉框的操作相对复杂一些,需要用到
Select
模块。我们来进行演示一波,由于暂时没找到合适的网页,我这边写了一个简单的网页本地测试(文件存为 demo.html)
<html> <body> <form> <select name="帅哥"> <option value="才哥">才哥</option> <option value="小明" selected="">小明</option> <option value="小华">小华</option> <option value="草儿">小草</option> </select> </form> </body> </html>
然后,再演示下拉框的不同选择的方式
from selenium import webdriver from selenium.webdriver.support.select import Select from selenium.webdriver.common.by import By import time url = 'file:///Users/yuting/Work/%E6%8E%88%E8%AF%BE/Python2206/01%E8%87%AA%E5%8A%A8%E5%8A%9E%E5%85%AC/day11-turtle%E7%9A%84%E4%BD%BF%E7%94%A8/demo.html' browser = webdriver.Chrome() browser.get(url) time.sleep(2) # 获取下来列表对应的标签 select_tag = browser.find_element(By.NAME, "帅哥") # 根据索引选择 Select(select_tag).select_by_index("2") time.sleep(2) # 根据value值选择 Select(select_tag).select_by_value("草儿") time.sleep(2) # 根据文本值选择 Select(select_tag).select_by_visible_text("才哥") time.sleep(2) # 关闭浏览器 browser.close()
12. 选项卡切换
我们在访问网页的时候会打开很多个页面,在Selenium
中提供了一些方法方便我们对这些页面进行操作。
current_window_handle
:获取当前窗口的句柄。
window_handles
:返回当前浏览器的所有窗口的句柄。
switch_to_window()
:用于切换到对应的窗口。
from selenium import webdriver
import time
browser = webdriver.Chrome()
# 打开百度
browser.get('http://www.baidu.com')
# 新建一个选项卡
browser.execute_script('window.open()')
print(browser.window_handles)
# 跳转到第二个选项卡并打开知乎
browser.switch_to.window(browser.window_handles[1])
browser.get('http://www.zhihu.com')
# 回到第一个选项卡并打开淘宝(原来的百度页面改为了淘宝)
time.sleep(2)
browser.switch_to.window(browser.window_handles[0])
browser.get('http://www.taobao.com')
13. 模拟鼠标操作
既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入ActionChains
类。
from selenium.webdriver.common.action_chains import ActionChains
13.1 左键
这个其实就是页面交互操作中的点击click()
操作。
13.2 右键:
context_click()
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
time.sleep(2)
# 定位到要右击的元素,这里选的新闻链接
right_click = browser.find_element(By.LINK_TEXT, '新闻')
# 执行鼠标右键操作
ActionChains(browser).context_click(right_click).perform()
time.sleep(2)
# 关闭浏览器
browser.close()
在上述操作中:
ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数传入
context_click(right_click):模拟鼠标双击,需要传入指定元素定位作为参数
perform():执行ActionChains()中储存的所有操作,可以看做是执行之前一系列的操作
13.3 双击:double_click()
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
time.sleep(2)
# 定位到要双击的元素
double_click = browser.find_element(By.CSS_SELECTOR, '.accessibility-icon')
# 双击
ActionChains(browser).double_click(double_click).perform()
time.sleep(15)
# 关闭浏览器
browser.close()
13.4 拖拽
drag_and_drop(source,target)
拖拽操作,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。
我们以菜鸟教程的一个案例来进行演示:
https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
time.sleep(2)
browser.switch_to.frame('iframeResult')
# 开始位置
source = browser.find_element(By.CSS_SELECTOR, "#draggable")
# 结束位置
target = browser.find_element(By.CSS_SELECTOR, "#droppable")
# 执行元素的拖放操作
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
# 拖拽
time.sleep(15)
# 关闭浏览器
browser.close()
13.5 悬停:
move_to_element()
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
url = 'https://www.baidu.com'
browser.get(url)
time.sleep(2)
# 定位悬停的位置
move = browser.find_element(By.ID, "s-usersetting-top")
# 悬停操作
ActionChains(browser).move_to_element(move).perform()
time.sleep(5)
# 关闭浏览器
browser.close()
14. 模拟键盘操作
selenium
中的Keys()
类提供了大部分的键盘操作方法,通过send_keys()
方法来模拟键盘上的按键。
引入Keys
类
from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE):删除键(BackSpace)
send_keys(Keys.SPACE):空格键(Space)
send_keys(Keys.TAB):制表键(TAB)
send_keys(Keys.ESCAPE):回退键(ESCAPE)
send_keys(Keys.ENTER):回车键(ENTER)
send_keys(Keys.CONTRL,‘a’):全选(Ctrl+A)
send_keys(Keys.CONTRL,‘c’):复制(Ctrl+C)
send_keys(Keys.CONTRL,‘x’):剪切(Ctrl+X)
send_keys(Keys.CONTRL,‘v’):粘贴(Ctrl+V)
send_keys(Keys.F1):键盘F1
…
send_keys(Keys.F12):键盘F12
15.常见配置
from selenium import webdriver
# 创建设置对象
options = webdriver.ChromeOptions()
# 解决DevToolsActivePort文件不存在的报错
options.add_argument('--no-sandbox')
# 谷歌文档提到需要加上这个属性来规避bug
options.add_argument('--disable-gpu')
# 隐藏滚动条, 应对一些特殊页面
options.add_argument('--hide-scrollbars')
# 图片不加载选其一
# 不加载图片, 提升速度
options.add_argument('blink-settings=imagesEnabled=false')
# 不加载图片, 提升速度
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
# 设置取消测试环境
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 无头模式
# 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败(无头浏览器)
# 减少了资源消耗的同时,增加了被反爬的风险
options.add_argument('--headless')
# 设置代理
option.add_argument('--proxy-server=http://代理服务器:端口')
# 避免终端下执行代码报错
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 加载拓展插件
options.add_extension(插件路径)
# 设置请求头
UA = "Mozilla…………"
options.add_argument(f"--user-agent={UA}")
# 设置配置
browser = webdriver.Chrome(options=options)
# 加载用户缓存
# 可以像正常使用浏览器一样,记录使用记录和cookie
# 如果不指定缓存路径,不指定的时候会创建临时文件夹。
# 如果selenium实例没有正常销毁,那么当前缓存文件夹不会被删除。
user_dir = r'C:\userDir'
options.add_argument(f"--user-data-dir={user_dir}")
# 去除navigator.webdriver属性
browser.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
}
)
# 或者
options.add_argument("disable-blink-features=AutomationControlled")
URL = 'https://www.baidu.com/'
# 加载页面
browser.get(URL)