Selenium简单使用介绍

部分测试基于百度首页

本地html读取方式driver.get('file:///Workspace/static-web/selenium.html')

以下内容基于:
Python 3.7.4
selenium 3.141.0
Chrome 80.0.3987.132 64bit

一、安装准备

  • python模块安装
    1
    2
    pip install selenium
    conda install selenium
  • WebDriver下载安装

    Google 驱动版本需要与浏览器版本对应
    Firefox

  • 驱动识别引入

    将文件路径添加到系统环境变量 PATH
    直接将驱动文件放置到python安装目录下的 bin 目录中

二、使用

1、控制并打开浏览器窗口

1
2
3
4
5
6
7
8
9
10
from selenium import webdriver

1、selenium版本较高时,推荐使用,避免测试结束忘记关闭
with webdriver.Chrome() as driver:
driver.get("http://www.baidu.com")

2、学习阶段建议使用,可以观察到某些变化
driver = webdriver.Chrome()
driver.get("htttp://www.baidu.com")
driver.close()

2、元素定位

推荐顺序 id > css 选择器
XPATH定位准确编写复杂且不利于debug
链接文本(部分)只适用于 a 链接元素

以下内容返回第一个匹配的元素,适用find_elements_xx可返回多个元素

定位元素 示例 使用方式
class名称 class="index-logo-src" driver.find_element_by_class_name('index-logo-src')
css选择器 #lg .index-logo-src driver.find_element_by_css_selector('#lg .index-logo-src')
id #lg driver.find_element_by_id('#lg')
name name="mp" driver.find_element_by_name('mp')
链接部分显示不符 <a>更多产品</a> driver.find_element_by_link_text('更多产品')
链接文本部分 <a>更多产品</a> driver.find_element_by_partial_link_text('更多')
tag标签 <map></map> driver.find_element_by_tag_name('map')
xpath选择 class="index-logo-src" driver.find_element_by_xpath('//div//img[@class="index-logo-src"]')

3、控制浏览器

操作 方法
打开浏览器 driver.get('http://www.baidu.com')
当前地址 driver.current_url
前进 driver.forward()
后退 driver.back()
刷新 driver.refresh()
标题 driver.title
当前窗口handle driver.current_window_handle
退出 driver.quit()
窗口大小 driver.get_window_size().get("width") height
重置窗口 driver.set_window_size(1024, 768)
窗口位置 driver.get_window_position().get('x')
设置窗口位置 driver.set_window_position(0, 0)
窗口最大化 driver.maximize_window()
全屏 driver.fullscreen_window()

切换窗口 – 官网示例
如果点击链接后会打开新的tab窗口,必须要切换窗口,driver才会跟着切换到新的窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Start the driver
with webdriver.Firefox() as driver:
# Open URL
driver.get("https://seleniumhq.github.io")

# Setup wait for later
wait = WebDriverWait(driver, 10)

# Store the ID of the original window
original_window = driver.current_window_handle

# Check we don't have other windows open already
assert len(driver.window_handles) == 1

# Click the link which opens in a new window
driver.find_element_by_link_text("new window").click()

# Wait for the new window or tab
wait.until(EC.number_of_windows_to_be(2))

# Loop through until we find a new window handle
for window_handle in driver.window_handles:
if window_handle != original_window:
driver.switch_to.window(window_handle)
break

# Wait for the new tab to finish loading content
wait.until(EC.title_is("SeleniumHQ Browser Automation"))

4、等待

等待期望元素加载完成。默认等待策略检测document.readyState状态变为complete,此时如果有script脚本创建元素,可能会出现无法定位到的情况

  • 显示等待

    1
    2
    10:等待时间 秒
    WebDriverWait(driver, timeout=10).until(lambda d: d.find_element_by_class_name('index-logo-src'))

    等待条件
    详情见from selenium.webdriver.support import expected_conditions

    弹窗 - 警告 提示 确认
    元素存在
    元素可见
    标题包含
    标题是

  • 隐式等待
    适合于明确页面元素加载需要一定时间

    1
    2
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
  • FluentWait
    可以配置等待时间,检查频率以及对某些异常的忽略

    1
    2
    wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=NoSuchElementException)
    wait.until(EC.element_to_be_clickable(By.XPATH, "//div"))

    5、JavaScript弹窗

    识别JavaScript弹出的警告、确认、提示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    alert = wait.until(EC.alert_is_present())
    // 警告 alert()
    text = alert.text # 弹窗文本
    alert.accept() # 确认

    // 确认 confirm()
    text = alert.text # 弹窗文本
    alert.accept() # 确认
    alert.dismiss() # 取消

    // 提示框 prompt() 需要输入文本
    alert = Alert(driver)
    alert.send_keys("Selenium") # 测试时在chrome未生效
    alert.accept()

6、系统键

ActionChains需要使用perform()才会生效
send_keys:

1
2
3
4
5
6
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('selenium' + Keys.ENTER)

keyDown:模拟按下修改键(CONTROL,SHIFT,ALT)的动作

1
2
3
action = webdriver.ActionChains(driver)

action.key_down(Keys.CONTROL).send_keys("a").perform()

keyUp:模拟修改键(CONTROL,SHIFT,ALT)的向上(或)释放操作

1
2
3
4
5
6
7
8
search = driver.find_element_by_id('kw')
action.key_down(Keys.SHIFT)\
.send_keys_to_element(search, 'qwerty')\
.key_up(Keys.SHIFT)\
.send_keys('qwerty')\
.perform()

传入内容:QWERTYqwerty

clear:清空文本

1
search.clear()

7、示例

以百度搜索,进入百度翻译,并修改翻译内容为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

driver.get('http://www.baidu.com')
driver.maximize_window()
# driver.implicitly_wait(5) # 隐式等待 不要和显示等待混用

# 返回单个元素
driver.find_element_by_id('kw')\
.send_keys('qwerty' + Keys.ENTER)

wait = WebDriverWait(driver, timeout=10) # 显示等待 超时10秒

wait.until(EC.title_contains('qwerty'))

divs = driver.find_elements_by_css_selector('#content_left div') # 返回list

ele = None
for div in divs:
text = div.text
# 匹配需要的元素
if 'Qwerty_百度翻译' in text:
ele = div
break

a = ele.find_element_by_partial_link_text('百度翻译')
print(a.get_attribute('href'))

origin_window = driver.current_window_handle # 获取当前窗口
a.click()

# 迭代所有窗口,窗口切换,切换driver指向, 按需求保存窗口
for win in driver.window_handles:
print(win)
if win != origin_window:
driver.switch_to.window(win)

wait.until(EC.title_is('百度翻译'))

# 如果不做窗口切换,driver指向的还是上一个窗口
input = driver.find_element_by_id('baidu_translate_input')
input.clear() # 清空
# input.send_keys('baidu')

# 此处需要使用perform后才会生效
action = ActionChains(driver)
action.key_down(Keys.SHIFT).send_keys_to_element(input, 'baidu').perform()

driver.close() # 关闭翻译链接新创建窗口,如果需要继续使用旧的窗口,需要进行switch_to
driver.switch_to.window(origin_window)
driver.close() # 关闭初始创建窗口
driver.quit() # 观察效果的时候需要注释 关闭窗口并且推出webdriver execute


Selenium简单使用介绍
https://probiecoder.cn/python/selenium_simple.html
作者
duwei
发布于
2025年4月22日
许可协议