文章目录
- 1. Selenium 安装
- 2. Selenium 基本功能
- 2.1 初始化浏览器
- 2.2 其他功能
- 3. 查找元素
- 3.1 八大定位方法
- 3.2 查找相对元素
- 3.3 键盘事件
- 4. 元素方法
- 5. JS执行
运行环境:
selenium==4.7.2
1. Selenium 安装
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接在浏览器中运行,就像真实用户所做的一样。Selenium测试可以在Windows、Linux和Macintosh上的Internet Explorer、Chrome和Firefox中运行。其他测试工具都不能覆盖如此多的平台。使用Selenium和在浏览器中运行测试还有很多其他好处。
selenium安装首先要看Google浏览器的版本,点击谷歌浏览器右上的三个点
→
\rightarrow
→ 帮助
→
\rightarrow
→ 关于 Google Chrome,即可看到下面的版本号。
版本号只需要看前两位即可,比如我这里只需要记住版本号是 108.0
就行,然后到这里去下载对应版本号前两位的驱动,比如这里我下载两个 108.0
的驱动都行。
然后将下载的压缩包解压,得到 chromedriver.exe
就是我们要使用的驱动文件。
2. Selenium 基本功能
2.1 初始化浏览器
# 这里的executable_path是上面下载的浏览器驱动的路径
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)
# 浏览器跳转到的网址
driver.get("https://www.baidu.com")
driver.quit()
2.2 其他功能
方法 | 描述 |
---|---|
driver.page_source | 获取当前页面的所有源码 |
driver.current_url | 获取当前页面的URL |
driver.close() | 关闭当前标签页,如果只有一个标签页则关闭整个浏览器 |
driver.quit() | 关闭整个浏览器 |
driver.forward() | 页面前进 |
driver.back() | 页面前进 |
driver.save_screenshot(img_name) | 页面截图,并保存到 img_name |
driver.maximize_window() | 最大化窗口 |
driver.minimize_window() | 最小化窗口 |
driver.fullscreen_window() | 全屏窗口,相当于按下F11 |
driver.minimize_window() | 最小化窗口 |
driver.get(url) | 跳转到URL |
driver.switch_to.new_window('tab') | 如果是参数是 'tab' ,则打开一个新的标签页;如果是 'window' ,打开一个新的窗口 |
driver.current_window_handle | 获取当前窗口的句柄 |
driver.window_handles | 获取当前浏览器的所有窗口的句柄 |
driver.switch_to.window(param) | 切换到param对应的窗口 |
3. 查找元素
selenium既然是模拟浏览器,那么肯定也能对浏览器进行一些点击或者输入内容的操作了,当需要进行点击等操作时,第一个操作其实是找到点击或输入的元素,由此,下面我介绍集中常用的元素查询方式。
3.1 八大定位方法
在selenium4中,像 find_element_by_id
这种方法都被移除了,不建议使用,换为了 find_element
方法以及 find_elements
方法。两个方法其实用途都是差不多的,只不过前面一个方法只返回查询到的第一个元素,后一个方法会返回查询到的所有元素。在使用这两种方法时,首先需要在第一个参数中注明是依据什么进行查询,第二个参数才是需要进行查询的内容,具体描述如下。
查询方式 | 描述 |
---|---|
find_element(By.ID, 'kw') | 返回 id=kw 的元素 |
find_element(By.NAME, 'kw') | 返回 name=kw 的元素 |
find_element(By.CLASS_NAME, 'kw') | 返回 class=kw 的元素 |
find_element(By.TAG_NAME, 'div') | HTML有许多的标签,如 div,span 等,返回标签为 div 的元素 |
find_element(By.LINK_TEXT, '新闻') | Link表示包含有属性 href = “https://www.xxxxxxx.com” 的元素,可以通过linktext定位,linktext是页面上展示的文字 |
find_element(By.PARTIAL_LINK_TEXT, '新') | 可通过部分的linktext进行查询 |
find_element(By.XPATH, '/html/body/script[5]') | 通过Xpath语法进行查询 |
find_element(By.CSS_SELECTOR, '#www-home-right > div.www-home-silde') | 可通过部分的linktext进行查询 |
上述查询方式中,Xpath查询需要一点Xpath语法基础,可以看我的上一篇文章进行学习,CSS查询方式的话符号 .
代表 class
, 符号 #
代表 id
,符号 >
代表下一级子元素。
具体每个方法查询的地方如下图所示
下面是示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)
driver.get("https://www.baidu.com")
# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯')
# 点击id=su的元素(即搜索)
driver.find_element(By.ID, 'su').click()
# 获取当前窗口的句柄
a=driver.current_window_handle
# 打开一个新的标签页
driver.switch_to.new_window('tab')
driver.get("https://www.baidu.com")
driver.find_element(By.LINK_TEXT, '新闻').click()
# 切换到第二个窗口
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
# 切换到搜索香克斯的窗口
driver.switch_to.window(a)
time.sleep(3)
driver.quit()
3.2 查找相对元素
这是selenium4新增加的方法,相对定位器,这种定位器是从人肉眼的角度来区分位置。该定位器使用的方法如下:
方法 | 描述 |
---|---|
above() | 查找该元素上面的元素 |
below() | 查找该元素下面的元素 |
to_left_of() | 查找该元素上面的元素 |
to_right_of() | 查找该元素上面的元素 |
near() | 查找该元素附近的元素 |
比如以下的百度首页,我查询视频所在元素的右边元素,那么我们查找到的就不止有其右边的三个元素,还有下面相对其偏右的所有元素。
拿上图做例子,示例代码如下:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name
from selenium.webdriver.support.relative_locator import locate_with
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)
driver.get("https://www.baidu.com")
link = driver.find_element(By.LINK_TEXT, '视频')
# with_tag_name能够只找寻对应传入参数对应的标签名
ele1 = driver.find_elements(with_tag_name('a').to_right_of(link))
# 可以在locate_with中使用上面的八大定位方法
ele2 = driver.find_elements(locate_with(By.TAG_NAME, 'a').to_right_of(link))
print(ele1[1].text)
print(ele2[4].text)
driver.quit()
输出如下
网盘
开年元首外交传递中国声音
3.3 键盘事件
send_keys()
方法能够想指定元素输入字符串,其实,除此之外还可以输入更多的键盘操作。
键盘事件 | 描述 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 制表键(Tab) |
send_keys(Keys.ESCAPE) | 回退键(Esc) |
send_keys(Keys.ENTER) | 回车键(Enter) |
send_keys(Keys.CONTROL,'a') | 全选(Ctrl+A) |
send_keys(Keys.CONTROL,'c') | 复制(Ctrl+C) |
send_keys(Keys.CONTROL,'x') | 剪切(Ctrl+X) |
send_keys(Keys.CONTROL,'v') | 粘贴(Ctrl+V) |
send_keys(Keys.F1) | 键盘 F1 |
由此,上面的搜索我们完全可以不用单独查询搜索的元素并点击,只需要在输入后加个回车键即可,更改后如下:
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)
driver.get("https://www.baidu.com")
# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯', Keys.ENTER)
time.sleep(3)
driver.quit()
4. 元素方法
当使用 find_elements()
方法后,得到的是一个个的 WebElement 对象组成的列表,这些对象肯定是无法直接使用的,这里我来介绍下这些对象所具有的方法以及属性。
方法或属性 | 描述 |
---|---|
click() | 点击当前元素 |
get_attribute(name) | 获取对象属性比如 name 可以为 class,name,id 等,如果 name='outerHTML' 则返回整个HTML元素 |
screenshot(file) | 获取当前元素的截图,保存为png |
send_keys(value) | 给当前元素模拟输入 |
text | 获取当前元素的文本内容 |
tag_name | 获取当前元素的标签名 |
size | 获取当前元素的大小 |
rect | 获取一个包含当前元素大小和位置的字典 |
parent | 获取当前元素的父节点 |
location | 获取当前元素的位置 |
id | 获取当前元素的id |
示例如下:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)
driver.get("https://www.baidu.com")
link = driver.find_element(By.LINK_TEXT, '视频')
# with_tag_name能够只找寻对应传入参数对应的标签名
ele1 = driver.find_elements(with_tag_name('a').to_right_of(link))
print('ele[1]为:{}'.format(ele1[1]))
print('ele[1]HTML格式为:{}'.format(ele1[1].get_attribute('outerHTML')))
print('ele[1]的class属性为:{}'.format(ele1[1].get_attribute('class')))
print('ele[1]文本为:{}'.format(ele1[1].text))
print('ele[1]位置为:{}'.format(ele1[1].location))
driver.quit()
输出结果为:
ele[1]为:<selenium.webdriver.remote.webelement.WebElement (session=“136a0261d244743418c7035dfca659d7”, element=“a8ed04b4-57c0-4540-b74b-c6c40b822b1d”)>
ele[1]HTML格式为:<a href=“https://pan.baidu.com?from=1026962h” target=“_blank” class=“mnav c-font-normal c-color-t”>网盘</a>
ele[1]的class属性为:mnav c-font-normal c-color-t
ele[1]文本为:网盘
ele[1]位置为:{‘x’: 341, ‘y’: 19}
5. JS执行
javascript是可以独以运行的脚本,可以不使用selenium的方法,进行页面元素的点击、输入、拖拽等等操作,像如果对js使用很熟练,那么也就完全不需要管上面的定位方式。全部可以使用js来实现页面元素的各种操作。
像滚动条拖拽是没法用元素定位操作的,只能使用js,比如我们使用搜索页面搜索后,将滚动条拖到底。
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)
driver.get("https://www.baidu.com")
# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯', Keys.ENTER)
time.sleep(3)
# 一般距离顶部10000的距离都已经见底了
driver.execute_script('document.documentElement.scrollTop=10000')
time.sleep(5)
driver.quit()