【Selenium】学习笔记


什么情况下适合使用selenium?

  1. 浏览器的一些相关自动化测试
  2. 网站有反爬虫机制
  3. 数据使用了动态加载,需要模拟一些浏览器行为才能获取

1、安装

pip install selenium -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2、下载浏览器驱动

selenium是在浏览器上运行操作的,所以针对不同的浏览器,需要下载不同的驱动,以下以谷歌Chrome浏览器为例。

2.1 查看浏览器版本:

    在浏览器地址框输入:chrome://settings/help,查看版本信息

在这里插入在这里插入图片描述
图片描述

2.2 下载对应操作系统,对应版本的驱动

驱动下载地址:https://chromedriver.storage.googleapis.com/index.html
(如果版本太新,在上述地址中找不到,可在该地址中查找对应操作系统的稳定版本使用:https://googlechromelabs.github.io/chrome-for-testing/)

2.3 注意

如果谷歌的版本更新了,则需要同步更新驱动才可使用;为了避免频繁更新驱动,可以将谷歌自动更新禁止

3、使用谷歌打开指定网站

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
 
driver_path = Service(r"H:\chromedriver.exe")
bro = webdriver.Chrome(service=driver_path)  # 初始化浏览器(有头模式)
bro.get("https://www.baidu.com/")  # 打开百度
bro.implicitly_wait(30)  # 隐式等待

有头模式:运行时显示浏览器窗口,有些可视化场景操作需要有头模式。
无头模式:运行时不显示浏览器窗口,资源消耗的少,效率较高。如果要设置无头浏览器,可在初始化时chrome_option中配置headless模式。
以上运行完成后,浏览器页面会自动关闭,也可在chrome_option中设置不自动关闭。

from selenium.webdriver.chrome.options import Options

chrome_option = Options()
chrome_option.add_argument("--headless")	# 无头模式
chrome_option.add_experimental_option("detach", True)	# 设置不自动关闭

4、定位页面元素

定位页面元素需要一些基础css+js等前端知识,此处默认会这些~
打开页面,按 F12 或者页面 右击 --> 检查,查看页面元素,如:

以下为selenuim:4.4.0版本的语法使用,较老的版本语法稍微有些变化
老版本: bro.find_element_by_id()
新版本: bro.find_element(By.ID)
以百度为例,如图
在这里插入图片描述

4.1 通过标签id定位

如图,输入框的标签元素id为‘kw’,

# <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
from selenium.webdriver.common.by import By
input = bro.find_element(By.ID,'kw')

4.2 通过标签name定位

如图,输入框的标签元素name为‘wd’,

# <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
from selenium.webdriver.common.by import By
input = bro.find_element(By.NAME,'wd')

4.3 通过class定位

如图,输入框的标签元素class为‘s_ipt’,

# <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
from selenium.webdriver.common.by import By
input = bro.find_element(By.CLASS_NAME,'s_ipt')

4.4 通过xpath定位

谷歌浏览器中在要定位的元素右击可直接获取xpath定位,xpath中有相对路径和绝对路径,使用效果相同。
当加了反爬虫机制的网站,id、name等属性值的可能是动态变换的,这时使用xpath的绝对路径定位更为可行~
在这里插入图片描述

from selenium.webdriver.common.by import By
input = bro.find_element(By.XPATH,'//*[@id="kw"]')

4.5 通过CSS定位

from selenium.webdriver.common.by import By
input = bro.find_element(By.CSS_SELECTOR,'#kw')
格式说明例子
*获取所有元素find_element(By.CSS_SELECTOR, ‘*’)
#idid选择器find_element(By.CSS_SELECTOR, ‘#kw’)
.classclass选择器find_element(By.CSS_SELECTOR, ‘.s_ipt’)
element任意元素选择器find_element(By.CSS_SELECTOR, ‘input’),获取所有input标签
element[属性]获取具体某具体属性值的元素find_element(By.CSS_SELECTOR, “input[name=wd]”),获取name属性为wd的input标签

以上可以看出,使用css定位其实可以包括id、name、class等定位,较为灵活,甚至比xpath效率高。

5、基础操作

5.1 常见元素操作

以上当我们定位到特定元素,怎么对元素进行点击、传值等操作,以下为百度搜索“python”为例:

方法作用
元素.send_keys()传递数据
元素.click()单击操作,左击
ActionChains(bro).double_click(元素)双击操作
元素.clear()清除内容

代码:

import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

chrome_option = Options()
chrome_option.add_experimental_option("detach", True)
driver_path = Service(r"H\chromedriver.exe")
bro = webdriver.Chrome(service=driver_path, chrome_options=chrome_option)  # 初始化浏览器(有头浏览器)
bro.get("https://www.baidu.com/")  # 打开地址
input = bro.find_element(By.CSS_SELECTOR, "input[id=kw]")
input.send_keys("Python")
time.sleep(2)
search_btn = bro.find_element(By.ID, "su")
search_btn.click()

效果图:
在这里插入图片描述

5.2 执行js操作页面元素

如拖动滚动条:

# 将class为slick的滚动条向下拖动500px
js = 'document.getElementsByClassName("slick").scrollTop=500'
bro.execute_script(js)

js操作适用一些动态数据的操作和获取,如随着滚动条拖动,数据才会加载的情况等。其他需要浏览器操作才加载的情况,都可参考使用js操作。如果大家对js命令不太熟悉,不确定自己所写的语句是否是想要的效果时,可先在浏览器–console中调试使用

5.3 浏览器操作

方法说明
bro.get(url)打开指定网址
bro.maximize_window()窗口最大化
bro.minimize_window()窗口最小化
bro.set_window_size(width, height)设置窗口大小
bro.refresh()刷新页面
bro.forward()页面前进
bro.back()页面后退
1、bro.execute_script(‘window.open(url);’)创建新标签页面(js方式)
2、bro.switch_to.new_window(‘tab’)创建新标签页面(浏览器方式)
handles = bro.current_window_handle获取当前标签页
handles = bro.window_handles获取所有的标签页
bro.switch_to.window(handles[-1])切换到最新的标签页
bro.switch_to.new_window(‘window’)创建新浏览器窗口
bro.get_screenshot_as_file(path)对当前标签页截图,path为存储路径
bro.close()关闭当前标签页面
bro.quit()关闭所有窗口

注意

 当要定位操作标签iframe、frame里元素,需要先switch,不然获取不到,
 原因:iframe、frame属于嵌套的浏览器窗口,所以定位iframe元素时,需要先切换到该frame窗口

如:

# 跳转到第一个iframe
bro.switch_to.frame(0)
# 或者,假设kw为iframe标签
iframe = driver.find_element(By.ID, 'kw')
bro.switch_to.frame(iframe)

5.4 鼠标操作

方法说明
元素.click()鼠标左击
ActionChains(bro).context_click(元素)鼠标右击
ActionChains(bro).double_click(元素)双击
ActionChains(bro).click_and_hold(元素)点击鼠标左键,不松开
ActionChains(bro).drag_and_drop(元素1,元素2)元素1拖动到元素2
ActionChains(bro).move_to_element(元素)鼠标移动到元素悬停

注意:

1)鼠标左击右击不同,右击需要使用ActionChains类;
2)ActionChains类方法的实现,都需要使用.perform()执行,如ActionChains(bro).context_click(元素).perform()

5.5 键盘操作

键盘操作一般结合send_keys()使用

方法说明
元素.send_keys(Keys.ENTER)回车
元素.send_keys(Keys.CONTROL,‘c’)复制
元素.send_keys(Keys.CONTROL,‘v’)粘贴
元素.send_keys(Keys.CONTROL,‘x’)剪切
元素.send_keys(Keys.CONTROL,‘a’)全选
元素.send_keys(Keys.BACK_SPACE)backspace回格
元素.send_keys(Keys.TAB)Tab
元素.send_keys(Keys.SPACE)空格

5.6 其他

如使用Win32的键盘操作,如

import win32api
# 发送 ctrl(17) + V(86)按钮
win32api.keybd_event(17, 0, 0, 0)
win32api.keybd_event(86, 0, 0, 0)
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开按键
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)

详细的键值对照可自行百度。
使用该键盘操作室需要注意:电脑不能息屏,否则操作会失效

6、等待响应

当页面元素不能马上全部加载时,定位元素时需要等待响应,否则会因找不到该元素报错
导入:

from selenium.webdriver.support.ui import WebDriverWait

6.1 显示等待

WebDriverWait(bro, timeout, poll_frequency=0.5, ignored_exceptions=None)

bro:浏览器驱动
timeout:等待响应时间,如果在响应时间内,定位到元素,则继续往下执行,否则报超时错
poll_frequency:查找元素时间间隔,如0.5,即在响应时间内每0.5秒定位元素,看是否找到
ignored_exceptions:是否忽略报错

一般显示等待和until()、until_not()配合使用,如:

# 显示等待10s,每0.5s定位一次元素,直到定位到该路径元素
wait = WebDriverWait(bro, 10, 0.5, ignored_exceptions=None)
wait.until(lambda bro: bro.find_element(By.XPATH, path))
ele = bro.find_element(By.XPATH, path)

6.2 隐式等待

bro.implicitly_wait(timeout)

timeout:设置超时时间,当响应时间内,定位到元素,则继续往下执行,否则报没找到元素的异常

6.3 强制等待

time.sleep(timeout)
即强制等待页面timeout秒,不管元素是否定位到,都需要等待timeout固定时间

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值