Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目,目前版本为selenium4.9.1。通过该工具您可以自动化操控chrome、firefox、edge等主流浏览器,效果相当于您亲手操作。本文主要基于python环境进行总结。
准备一:安装selenium库

pip install selenium

准备二:下载对应浏览器的driver程序
下载前需要确认电脑浏览器的版本号,再下载相对应的程序。

如果需要其他浏览器驱动程序,也可以在 淘宝镜像站 上查找。驱动程序下载后,可以保存在对应浏览器的程序文件夹中,也可以放在python脚本目录中,只要运行时指定好程序路径即可。

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


exePath = r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'
s = Service(exePath)
op = webdriver.ChromeOptions()
browser = webdriver.Chrome(service=s, options=op)
browser.get('http://www.gxela.gov.cn')
browser.maximize_window()
browser.implicitly_wait(9)
write = browser.find_element(By.ID,"j_username")
write.send_keys("user123132")
write = browser.find_element(By.ID,"j_password1")
write.send_keys("pwd123456786")
browser.find_element(By.XPATH, '//*[@id="res-index"]/form[1]/div[4]').click()

官方给出的入门例子

from selenium import webdriver
from selenium.webdriver.common.by import By


def test_eight_components():
    driver = webdriver.Chrome()

    driver.get("https://www.selenium.dev/selenium/web/web-form.html")

    title = driver.title
    assert title == "Web form"

    driver.implicitly_wait(0.5)

    text_box = driver.find_element(by=By.NAME, value="my-text")
    submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")

    text_box.send_keys("Selenium")
    submit_button.click()

    message = driver.find_element(by=By.ID, value="message")
    value = message.text
    assert value == "Received!"

    driver.quit()

元素定位

主要有8种不同的内置元素定位策略:

定位器Locator 描述
class name定位 class属性与搜索值匹配的元素(不允许使用复合类名)
css selector 定位CSS选择器匹配的元素
id 定位id属性与搜索值匹配的元素
name 定位name属性与搜索值匹配的元素
link text 定位link text可视文本与搜索值完全匹配的锚元素
partial link text 定位link text可视文本部分与搜索值部分匹配的锚点元素。如果匹配多个元素,则只选择第一个元素。
tag name 定位标签名称与搜索值匹配的元素
xpath 定位与XPath表达式匹配的元素
# find_element只返回第一个元素,find_elements则返回元素集
# class name定位,information为类名
driver.find_element(By.CLASS_NAME, "information")
# css selector定位,fname为id
driver.find_element(By.CSS_SELECTOR, "#fname")
# 通过id定位,lname为id
driver.find_element(By.ID, "lname")
# name属性定位
driver.find_element(By.NAME, "newsletter")
# link text定位,为超链接标签名
driver.find_element(By.LINK_TEXT, "Selenium Official Page")
# partial link text,可以理解为部分匹配
driver.find_element(By.PARTIAL_LINK_TEXT, "Official Page")
# tag name定位
driver.find_element(By.TAG_NAME, "a")
# xpath定位
driver.find_element(By.XPATH, "//input[@value='f']")

# 嵌套查询
fruits = driver.find_element(By.ID, "fruits")
fruit = fruits.find_element(By.CLASS_NAME,"tomatoes")
# 或优化为
fruit = driver.find_element(By.CSS_SELECTOR,"#fruits .tomatoes")

# 查询div中全部p元素的文本内容并输出
element = driver.find_element(By.TAG_NAME, 'div')
elements = element.find_elements(By.TAG_NAME, 'p')
for e in elements:
    print(e.text)

# 获取元素文本内容
text = driver.find_element(By.ID, "justanotherlink").text
# 页面元素是否显示
is_email_visible = driver.find_element(By.NAME, "email_input").is_displayed()
# 页面元素是否启用
is_email_visible = driver.find_element(By.NAME, "email_input").is_displayed()
# 元素是否被选中
value = driver.find_element(By.NAME, "checkbox_input").is_selected()
# 获取元素标签名
attr = driver.find_element(By.NAME, "email_input").tag_name
# 获取元素位置和大小,x、y、高度、宽度
res = driver.find_element(By.NAME, "range_input").rect
# 获取元素CSS值
cssValue = driver.find_element(By.ID, "namedColor").value_of_css_property('background-color')
# 获取特性或属性
email_txt = driver.find_element(By.NAME, "email_input")
value_info = email_txt.get_attribute("value")

文本输入和点击操作

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()


driver.get("http://www.google.com")

    # 定位按钮并点击
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button").click()
    # 输入"webdriver"后按回车键
driver.find_element(By.NAME, "q").send_keys("webdriver" + Keys.ENTER)
    # 定位搜索框
SearchInput = driver.find_element(By.NAME, "q")
    # 搜索框中输入selenium
SearchInput.send_keys("selenium")
    # 清除输入的内容
SearchInput.clear()

警告框的处理

# 点击按钮弹出警告框
driver.find_element(By.LINK_TEXT, "See a sample confirm").click()
# 等待弹出
wait.until(expected_conditions.alert_is_present())
# 存储到变量中
alert = driver.switch_to.alert
# 保存警告框的内容
text = alert.text
# 按下取消按钮
alert.dismiss()
  
# 按下按钮弹出提示框
driver.find_element(By.LINK_TEXT, "See a sample prompt").click()
# 等待显示
wait.until(expected_conditions.alert_is_present())
# 保存对象
alert = Alert(driver)
# 发送文字内容给提示框
alert.send_keys("Selenium")
# 按下确定按钮
alert.accept()
  

frame页面的处理

    # 方法一:定位frame对象
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")
    # 切换到选择的 iframe
driver.switch_to.frame(iframe)
    # 单击frame中的按钮
driver.find_element(By.TAG_NAME, 'button').click()

    # 方法二:也可以通过 frame的id 切换到buttonframe框架
driver.switch_to.frame('buttonframe')
    
    # 方法三:基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
    # 切换到选择的 iframe
driver.switch_to.frame(iframe)

    # 离开frame切回到默认内容
driver.switch_to.default_content()

关于浏览器窗口的操作比较多,可以自行到官方网址进行学习 https://www.selenium.dev/zh-cn/documentation/webdriver/interactions/windows/ 。常用的操作有:

    # 窗口最大化
driver.maximize_window()
    # 窗口最小化
driver.minimize_window()
    # 全屏幕截图
driver.save_screenshot('./image.png')
    # 对某个元素截图
ele = driver.find_element(By.CSS_SELECTOR, 'h1')
ele.screenshot('./image.png')

    # 执行js脚本
header = driver.find_element(By.CSS_SELECTOR, "h1")
    # 执行脚本以获得header元素的文本内容
driver.execute_script('return arguments[0].innerText', header)
    # 其他js脚本例子:
lessonName = browser.execute_script("return document.getElementsByClassName('function-desc-text-desc'')[0].textContent")
    # 又如查询视频时长:
js = '''
        var vd = document.querySelector("video");
        return vd.duration;
    '''
duration = browser.execute_script(js)