Selenium常见操作

元素定位

在Selenium中,定位需要导入By模块 from selenium.webdriver.common.by import By

  • id定位,find_element(By.ID,'id的值')
  • name定位,find_element(By.NAME,'name的值')
  • class定位,find_element(By.CLASS_NAME,'class的值')
  • 标签名定位,find_element(By.TAG_NAME,'标签名')
  • 文本连接定位,find_element(By.LINK_TEXT,'文本连接')
  • 部分文本链接定位,find_element(By.PARTIAL_LINK_TEXT,'部分文本链接')
  • Xpath定位,find_element(By.XPATH,'XPATH表达式')
  • CSS定位,find_element(By.CSS_SELECTOR,'CSS表达式')

根据id定位

  • 先定位到需要操作的html元素

比如: <input type="text" value="请输入用户名" id="usr" class="info box">

可以看到他有一个id为 usr ,此时就可以使用id定位

from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(1)
# 根据id定位到 用户名输入框 clear() 清空输入框内容
d.find_element(By.ID,'usr').clear()
sleep(3)
d.quit()

根据class定位

  • 先定位到需要操作的html元素

比如: <input type="text" value="请输入用户名" id="usr" class="info box">

可以看到他有一个class为 info box ,此时就可以使用class定位
但是值得注意的是,info box 属性值之间使用空格分隔开,表示有多个属性值,此时只能使用一个

from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(1)
# 根据id定位到 用户名输入框 clear() 清空输入框内容
d.find_element(By.CLASS_NAME,'info').clear()
sleep(3)
d.quit()

根据name定位

比如: <input type="password" name="pwd" class="info">
他有一个name属性为pwd

from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(3)
# 根据 name 定位到 密码输入框 send_keys('输入的内容')
d.find_element(By.NAME,'pwd').send_keys('admin123')
sleep(3)
d.quit()

根据文本链接定位

文本链接定位由两种,一个是完整的文本链接信息,一个是部分的文本文本链接信息

find_element(By.LINK_TEXT,'文本连接')
find_element(By.PARTIAL_LINK_TEXT,'部分文本链接')

代码实例:

from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(3)
# 文本链接定位 # click() 点击,单击
d.find_element(By.LINK_TEXT,'这是去百度的网址啊').click()
d.find_element(By.PARTIAL_LINK_TEXT,'去百').click() # in
sleep(3)
d.quit()

标签名定位

  • 先定位到需要操作的html元素

比如: <input type="text" value="请输入用户名" id="usr" class="info box">

可以看到他的标签名为input

from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(1)
# 根据id定位到 用户名输入框 clear() 清空输入框内容
d.find_element(By.TAG_NAME,'input').clear()
sleep(3)
d.quit()

Xpath定位

  • 绝对路径定位(了解)

从最上层标签 一级一级 往下找
/html/body/div/input

[第几个] div[3] 第三个div标签
/html/body/div[3]/input

  • 路径+属性定位
    语法: //标签名[@属性名="属性值"]
    //标签名[@属性名="属性值"]
    //标签名[@属性名="属性值"][@属性名="属性值"]
    //标签名[@属性名="属性值"][@属性名="属性值"]/子标签[@属性名="属性值"]
    实例:
    定位到 type="password"input 标签
//input[@type="password"]

定位到 class="info" 并且 name="pwd"的 input标签

//input[@class="info"][@name="pwd"]

定位到 id="userpass"的div标签 下的 class="info"的input标签

//div[@id="userpass"]/input[@class="info"]

定位到 id="location"的 div标签 下的 第三个p标签

//div[@id="location"]/p[3]

注意:如果使用[]表示属性时,属性如果有多个值,必须全部使用

定位到 type="password" 元素
Xpath: //*[@type="password"]
Css : [type="password"]

CSS定位

语法: 标签名[属性名="属性值"]

  • 标签+属性定位

实例:
定位到 type="password"input 标签
input[type="password"]

定位到 class="info" 并且 name="pwd"的 input标签
input[class="info"][name="pwd"]

定位到 id="userpass"的div标签 下的 class="info"的input标签
在css中 使用 空格 表示下级(不一定是子标签)标签

div[id="userpass"] input[class="info"]

  • CSS中 针对 id (#) 以及 class (.) 提供了两种快捷方式(简写)
  • 定位到 id="kw" 的 input标签
input[id="kw"] >>> input#kw
  • 定位到 class="kw" 的 input标签
input[class="kw"] >>> input.kw
  • 定位到 id="kw" 的 标签
#kw
  • 定位到 class="kw" 的 标签
.kw

常见操作

获取属性对应值以及文本信息

  • 获取属性对应值,根据属性名称获取对应的值

get_attribute('属性名称')

  • 获取元素文本信息

text

实例: 定位到 id="getval01"的标签,获取其title属性以及文本信息

from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(3)
# 定位到 诗词的 div标签
# 获取属性的值 , 通过属性名称 返回到对应的值 get_attribute('属性名称')
msg = d.find_element(By.CSS_SELECTOR,'[id="getval01"]').get_attribute('title')
print(msg)
# 获取到 标签的文本信息
msg2 = d.find_element(By.CSS_SELECTOR,'[id="getval01"]').text
print(msg2)
sleep(3)
d.quit()

上传文件

  • 针对input标签的上传按钮,可以直接定位到该按钮,然后send_keys(文件路径)即可上传
from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(3)
# 定位到上传按钮,直接 send_keys(R'路径') 输入路径
# 只能够 处理 input 标签的上传按钮
d.find_element(By.CSS_SELECTOR,'[name="file"]').send_keys(R'C:\abc.png')
sleep(3)
d.quit()

执行js语句/判断元素是否显示

  • window.scrollTo(0,y); # y 需要替换成 与顶部的距离
  • document.querySelector('CSS定位').removeAttribute('属性名称');
  • 判断元素是否可见 is_displayed(),返回True或者False

具有特殊含义的属性

readonly="readonly" 只读属性
type="hidden" 隐藏属性
style="display:none;" 隐藏属性
from selenium import webdriver
from selenium.webdriver.common.by import By # 定位需要导入 By 模块
from time import sleep
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(3)
# js语句 滚动条 下拉
# window.scrollTo(0,y); # y 需要替换成 与顶部的距离
# 想让滚动条 下拉 500px
myjs = "window.scrollTo(0,500);"
d.execute_script(myjs)
# 判断元素是否可见 is_displayed(),返回True或者False
# 隐藏元素 可以定位,只是无法操作,如果想要操作,就需要去除掉隐藏属性
sleep(3)
res = d.find_element(By.CSS_SELECTOR,'[id="ip2"]').is_displayed()
print(res)
# 去除属性的js语句
# document.querySelector('CSS定位').removeAttribute('属性名称');
myjs2 = """document.querySelector('[id="ip2"]').removeAttribute('type');"""
d.execute_script(myjs2)
'''
readonly="readonly" 只读属性 readonly
type="hidden" 隐藏属性 type
style="display:none;" 隐藏属性 style
'''
sleep(3)
d.quit()

鼠标悬停

语法:

  1. 需要先导入 ActionChains() 实现鼠标悬停 导入 from selenium.webdriver import ActionChains
  2. 语法 : ActionChains(浏览器).move_to_element(需要悬停的元素).perform()
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(2)
js = """window.scrollTo(0,1000);"""
d.execute_script(js)
sleep(1)
# 鼠标悬停
# 1、先定位到需要悬停的元素
mte = d.find_element(By.CSS_SELECTOR,'[class="btn"]')
# 2、实现鼠标悬停 导入 from selenium.webdriver import ActionChains
# ActionChains(浏览器).move_to_element(需要悬停的元素).perform()
ActionChains(d).move_to_element(mte).perform()
sleep(1) # 悬停之后,最好等待1s中,悬停过程中,放下鼠标键盘
# 3、点击悬停后 出现的元素
d.find_element(By.LINK_TEXT,'淘宝网').click()
sleep(3)
d.quit()

下拉框定位

导包: from selenium.webdriver.support.ui import Select
语法:

Select(下拉框元素定位).select_by_index(下标)
Select(下拉框元素定位).select_by_value(value的值)
Select(下拉框元素定位).select_by_visible_text(文本信息)

实例:

# 只有 下拉框 是 select标签的才可以使用
# 通用方式
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(2)
js = """window.scrollTo(0,1300);"""
d.execute_script(js)
sleep(1)
# 1、先定位到需要操作的下拉框
sel_ele = d.find_element(By.CSS_SELECTOR,'[name="op01"]')
# 2、导入Select模块,进行操作
# 2.1 根据 选项的下标来 Select(下拉框的元素定位).select_by_index(选项的下标)
Select(sel_ele).select_by_index(2)
sleep(1)
# 2.2 根据选项的value属性值 Select(下拉框的元素定位).select_by_value('value属性值')
Select(sel_ele).select_by_value('zj')
sleep(1)
# 2.3 根据选项的文本信息 Select(下拉框的元素定位).select_by_visible_text('选项的文本信息')
Select(sel_ele).select_by_visible_text('江苏')
sleep(1)
sleep(5)
d.quit()

切换窗口

  • Selenium默认只在第一个窗口操作,多窗口操作时需要切换窗口
  1. 先获取所有窗口 window_handles 以列表的形式返回
  2. 切换窗口 switch_to.window(窗口的下标)
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(2)
js = """window.scrollTo(0,1500);"""
d.execute_script(js)
sleep(1)
d.find_element(By.LINK_TEXT,'去一个新窗口').click() # 点击之后 弹出一个新窗口
# Selenium默认只在第一个窗口操作,多窗口操作时需要切换窗口
# 1、先获取所有窗口 window_handles 以列表的形式返回
allwin = d.window_handles
# 2、切换窗口 switch_to.window(窗口的下标)
d.switch_to.window( allwin[1] )
d.find_element(By.CSS_SELECTOR,'[id="only"]').send_keys('输入一些内容')
sleep(5)
d.quit()

切换警告框

警告框一个页面只能够出现一次,所以不需要定位,直接切换即可

通过 switch_to.alert.dismiss() 取消警告框
通过 switch_to.alert.accept() 确认警告框

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(2)
js = """window.scrollTo(0,1500);"""
d.execute_script(js)
sleep(1)
d.find_element(By.CSS_SELECTOR,'[type="button"]').click() # 点击之后出现警告框
sleep(2)
# 1、确定 警告框 switch_to.alert.accept()
# d.switch_to.alert.accept()
# 2、关闭/取消 警告框 switch_to.alert.dismiss()
# d.switch_to.alert.dismiss()
# 3、获取警告框的 文本信息 switch_to.alert.text
msg = d.switch_to.alert.text
print(msg)
sleep(5)
d.quit()

切换表单

表单嵌套是前端常用的一种技术,如果你操作的元素处于frame标签或者iframe标签中的时候,需要先切换到该标签在进行操作
switch_to.frame(定位) 切换表单

注意 表单切换完成如果想要退出,退回到上层表单:d.switch_to.parent_frame(), 退回到最外层表单:d.switch_to.default_content()

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(2)
js = """window.scrollTo(0,1800);"""
d.execute_script(js)
sleep(1)
# 如果检查了定位 确认定位没有问题,但是仍然报错
# 此时 我们的定位元素 很大概率 就是处于 另外一个表单
# 表单 在html中 是一种常见的技术 一般就是 通过 frame标签,或者 iframe标签 实现
# 如果你的操作 的元素 处于 frame标签 或者 iframe标签,就需要先切换到 该标签
# 1、先定位到需要切换到的 frame标签或者iframe标签
fre_ele = d.find_element(By.CSS_SELECTOR,'[id="fr01"]')
# 2、切换到该标签 switch_to.frame( frame标签或者iframe标签的元素定位 )
d.switch_to.frame( fre_ele )
sleep(1)
d.find_element(By.CSS_SELECTOR,'[id="only"]').send_keys('123456')
sleep(2)
# 3、在表单中完成操作后,需要跳出表单
# d.switch_to.parent_frame() # 跳到上一层表单
d.switch_to.default_content() # 跳出到最外层表单
d.find_element(By.CSS_SELECTOR,'[type="button"]').click()
sleep(5)
d.quit()

定位一组元素

通过find_elements()定位一组元素,将所有符合元素的定位以列表的方式返回

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
d = webdriver.Firefox()
d.maximize_window()
d.implicitly_wait(5)
d.get('http://192.168.4.64/')
sleep(2)
js = """window.scrollTo(0,3000);"""
d.execute_script(js)
sleep(1)
# 定位勾选框 元素1
# find_element() 定位是一个元素,返回一个元素 元素1
# find_elements() 定位一组元素 , 以列表的形式返回 [元素1,元素2,元素3]
allbox = d.find_elements(By.CSS_SELECTOR,'[type="checkbox"]')
for i in allbox:
i.click()
sleep(0.5)
sleep(5)
d.quit()

显示等待(了解)

# 显式等待 有条件的等待 一次性
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
d = webdriver.Chrome()
d.get('https://www.baidu.com')
wait = WebDriverWait(d,10)
# 等待 某个元素 可以被点击
wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR,'xxxx') )) # 一次性
# title_is 标题是某内容
# title_contains 标题包含某内容
# presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
# visibility_of_element_located 元素可见,传入定位元组
# visibility_of 可见,传入元素对象
# presence_of_all_elements_located 所有元素加载出
# text_to_be_present_in_element 某个元素文本包含某文字
# text_to_be_present_in_element_value 某个元素值包含某文字
# frame_to_be_available_and_switch_to_it frame加载并切换
# invisibility_of_element_located 元素不可见
# element_to_be_clickable 元素可点击
# staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
# element_to_be_selected 元素可选择,传元素对象
# element_located_to_be_selected 元素可选择,传入定位元组
# element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
# element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
# alert_is_present 是否出现Alert
posted @   三木三木大三木  阅读(366)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示