通过selenium的方式可以实现与web进行交互操作,本文列举了一些基础的写法,澄清了网络上一些错误写法,并给出了一些模拟动作函数。
欢迎大家收藏,未来会继续更新本文。文中的错误请大家在评论指出。
版本说明:selenium=4.4.3
代码测试平台:win10(chrome=104.0.5112.102)、Mac M1(chrome=105.0.5195.125)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 通过Option写入启动浏览器的参数
chrome_options = Options()
chrome_options.add_argument("--no-sandbox") # 传入该能解决部分root相关问题
# chrome_options.add_argument("--headless") # 传入该参数后,浏览器不会打开,一切操作后台执行
chrome_options.add_argument("--disable-dev-shum-usage")
# 基于上述参数启动浏览器
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get(url) # 指定打开的网页
print("Chrome Task title: " + driver.title)
# 前进
driver.forward()
# 后退
driver.back()
# 刷新
driver.refrash()
版本说明:
新版selenium与旧版存在更新,统一使用find_element函数,通过By传参。
安装最新版selenium使用旧版会存在"AttributeError: ‘WebDriver’ object has no attribute xxxx"报错。
旧版:
(1)driver.find_element_by_id(“value”)
(2)driver.find_element_by_class_name(“value”)
(3)…
新版:
(1)driver.find_element(By.ID, “value”)
(2)driver.find_element(By.CSS_SELECTOR, “value”)
(3)…
个人推荐css selector,写法更加通用,传参中指定条件(id/class/type)。
需要注意的是,这里使用find_element方法只会返回一个元素,默认为第一个符合条件的元素。如果使用find_elements方法会返回list。
from selenium.webdriver.common.by import By
# 基于CSS
driver.find_element(By.CSS_SELECTOR, values) # 通式
# 基于xpath
driver.find_element(By.XPATH, values) # 通式
条件 | html | values 写法1 | values 写法2 |
---|---|---|---|
标签 | ‘div’ | - | |
id | < button id=“button”> | ‘#button’ | ‘[id=“button”]’ |
class | < button class=“el-button”> | ‘.el-button’ | ‘[class=“el-button”]’ |
multi-class | < button class=“el-button el-button–primary”> | ‘.el-button.el-button–primary’ | ‘[class=“el-button el-button–primary”]’ |
type name … |
- | - | 同上 |
头尾匹配写法:其中,头尾匹配可以是部分字符,部分匹配需要是按空格分隔的完整字符。
条件 | html | values 写法1 (头部匹配) |
values 写法2 (尾部匹配) |
values 写法3 (部分匹配) |
---|---|---|---|---|
class | < button class=“el-button el-button–primary”> | ‘[class^=“el-button”]’ | ‘[class$=“–primary”]’ | ‘[class~=“el-button”]’ |
(1)同时包含两个条件
# 这里使用CSS举例
# 包含input标签与type='text'属性
driver.find_element(By.CSS_SELECTOR, 'input[type="text"]')
# 包含type='text'与maxlength='50'两个条件的元素,语法上不需要and进行连接
driver.find_element(By.CSS_SELECTOR, '[type="text"][maxlength="50"]')
(2)包含一个条件且不包含另一条件
# 包含type='text'且不包含maxlength='50'的元素,语法上使用:not()进行连接
driver.find_element(By.CSS_SELECTOR, '[type="text"]:not([maxlength="50"])')
新版css 使用’:contains(“xxx”)'会报错illegal。查阅了一些资料,没有发现在css selector中使用:contain的方法,欢迎大家补充。
同时,网上某些方法的语法存在问题,这里做一下澄清。
# 这里使用xpath进行text定位
driver.find_element(By.XPATH, values)
html | values写法1 | values写法2 | |
---|---|---|---|
模糊匹配 | < div type=‘button’>登陆< /div> | “//div[contains(text(),‘登陆’)]” | “//*[contains(text(),‘登陆’)]” |
准确匹配 | < div type=‘button’>登陆< /div> | “//div[text()=‘登陆’]” | “//*[text()=‘登陆’]” |
注:本人遇到过模糊匹配可以定位,但是准确匹配无法定位的情况。大家可以优先使用模糊匹配。
这里给大家一些动作的示例,更多的组合动作大家自己探索。
from selenium.webdriver.common.action_chains import ActionChains
# 鼠标点击
def dom_click(values, by='css'):
if by == 'css':
driver.find_element(By.CSS_SELECTOR, values).click()
elif by == 'xpath':
driver.find_element(By.XPATH, values).click()
# 鼠标悬停
def dom_focus(values, by='css'):
if by == 'css':
location = driver.find_element(By.CSS_SELECTOR, values)
elif by == 'xpath':
location = driver.find_element(By.XPATH, values)
chain = ActionChains(self._driver)
chain.move_to_element(location)
chain.perform()
# 键盘输入
def type(text):
chain = ActionChains(driver)
chain.send_keys(text)
chain.perform()