Python+Selenium4 Web自动化测试框架--元素定位篇
·
元素定位:
-
id定位:
driver.get("https://www.baidu.com/") driver.find_element(By.ID,"kw").send_keys("软件测试") driver.find_element(By.ID,"su").click() -
class_name定位:
driver.get("https://www.bilibili.com/") #如果不指定下角标的话,默认选择第一个 #driver.find_element(By.CLASS_NAME,'channel-link').click() #有下角标,选择下角标指定的 elements = driver.find_elements(By.CLASS_NAME,'channel-link') elements[5].click() -
name定位
from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://sahitest.com/demo/alertTest.htm') driver.maximize_window() driver.find_element(By.NAME, 'b2').click() sleep(2) driver.close() -
LINK_TEXE定位
driver.get("https://www.bilibili.com/") driver.find_element(By.LINK_TEXT,'番剧').click() -
CSS定位
from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.maximize_window() driver.get('https://www.baidu.com/') #driver.get('https://www.bilibili.com/') #css,根据id定位 #driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('影石') #driver.find_element(By.CSS_SELECTOR,'#su').click() #css,根据class定位 #driver.find_element(By.CSS_SELECTOR,'.nav-search-input').send_keys('哈哈哈') #driver.find_element(By.CSS_SELECTOR,'.nav-search-btn').click() #css,根据属性值定位 #driver.find_element(By.CSS_SELECTOR,'[name="wd"]').send_keys("123") #driver.find_element(By.CSS_SELECTOR,'#su').click() #css,根据标签定位 #driver.find_element(By.CSS_SELECTOR,"a[href='//www.bilibili.com/anime/']").click() #模糊查找,根据开头匹配,在“=”前加上“*” #driver.find_element(By.CSS_SELECTOR,"a[href*='bilibili.com/movie/']").click() #根据开头匹配,在“=”前加上“^” #driver.find_element(By.CSS_SELECTOR,"a[href^='//www.bilibili.com/ani']").click() #根据结尾匹配,在“=”前加上“$” #driver.find_element(By.CSS_SELECTOR,"a[href$='com/anime/']").click() #组合查找:input标签+id值为nav-search-input #driver.find_element(By.CSS_SELECTOR,'input.nav-search-input').click() #定位子元素 #组合id进行定位,id值前需要加“#” #driver.find_element(By.CSS_SELECTOR,"div#s-top-left>a").click() #组合class进行定位,id值前需要加“.” #driver.find_element(By.CSS_SELECTOR,"div.s-top-left-new.s-isindex-wrap>a").click() #加上:nth-child()对子元素进行定位,()括号内可指定第几个子元素 #driver.find_element(By.CSS_SELECTOR,"div#s-top-left>a:nth-child(3)").click() #find_elements加上[n]进行定位 #driver.find_elements(By.CSS_SELECTOR,"div#s-top-left>a")[3].click() #通过复制 driver.find_element(By.CSS_SELECTOR,"#s-top-left > a:nth-child(5)").click() sleep(5) -
XPATH定位
import time from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.maximize_window() driver.get('https://www.baidu.com/') #绝对路径 #driver.find_element(By.XPATH,"/html/body/div[1]/div[2]/div[6]/div/div/div[2]/div/div[1]/div/div[1]/div/div/ul/li[1]/a/span[1]").click() #相对路径,根据id定位; 属性前需要加上“@” #driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys("原神启动") #driver.find_element(By.XPATH,'//input[@id="su"]').click() #相对路径,组合条件查询; * 表示任意标签; #driver.find_element(By.XPATH,'//*[@id="s-top-left"]/a[4]').click() #driver.find_element(By.XPATH,'//*[@class="s-top-left-new s-isindex-wrap"]/a[4]').click() #通过子元素去找父元素 #driver.find_element(By.XPATH,'//*[@class="s-top-left-new s-isindex-wrap"]/a[2]').click() #通过文本去查找 #[text()="中共中央政治局召开会议"] 表示查找文本内容完全等于“中共中央政治局召开会议”的 <span> 标签 #driver.find_element(By.XPATH,'//span[text()="中共中央政治局召开会议"]').click() #根据同级弟弟定位 #following::a 表示在包含“贴吧”文本的 <a> 标签之后的所有 <a> 标签; [1] 表示选择第一个紧跟在“贴吧”链接之后的 <a> 标签 #driver.find_element(By.XPATH,'//a[contains(text(),"贴吧")]/following::a[1]').click() # #根据同级哥哥定位; # preceding::a 表示在包含“贴吧”的 <a> 标签之前的所有 <a> 标签; [2] 表示选择倒数第二个符合条件的 <a> 标签 driver.find_element(By.XPATH,'//a[contains(text(),"贴吧")]/preceding::a[2]').click() time.sleep(5)
常见的选择框练习:
单选框radio定位:
练习网址:https://www.iviewui.com/view-ui-plus/component/form/radio
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.iviewui.com/view-ui-plus/component/form/radio')
driver.maximize_window()
#driver.find_elements(By.XPATH,'//span/input[@type="radio"and@class="ivu-radio-input"]')[6].click()
#/..:向上一级,定位 <i> 元素的父元素。
#/span[contains(text(),"Android")]:从父元素继续定位一个包含文本 "Android" 的 <span> 子元素。
driver.find_element(By.XPATH,'//i[@class="ivu-icon ivu-icon-social-android"]/../span[contains(text(),"Android")]').click()
time.sleep(5)
driver.close()
CheckBox多选框定位:
网址:https://www.iviewui.com/view-ui-plus/component/form/checkbox
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.iviewui.com/view-ui-plus/component/form/checkbox')
driver.maximize_window()
#driver.find_element(By.XPATH,'//span[text()="香蕉"]').click()
driver.find_element(By.XPATH,'//span[text()="香蕉"]/preceding-sibling::span/input').click()
sleep(2)
#driver.find_element(By.XPATH,'//span[text()="苹果"]').click()
driver.find_element(By.XPATH,'//span[text()="苹果"]/preceding-sibling::span/input').click()
sleep(3)
#driver.find_element(By.XPATH,'//span[text()="西瓜"]').click()
driver.find_element(By.XPATH,'//span[text()="西瓜"]/preceding-sibling::span/input').click()
sleep(4)
driver.close()
select下拉框定位:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
driver.get('https://sahitest.com/demo/selectTest.htm')
driver.maximize_window()
#通过 ID s3Id 定位 <select> 元素,并使用 Select 对象进行包装,从而可以方便地使用 Select 的方法来选择下拉选项。
select = Select(driver.find_element(By.ID,'s3Id'))
#选择不同选项的三种方法:
#通过选项的索引来选择第4个选项(索引从0开始)
#select.select_by_index(3)
#通过选项的显示文本来选择某个选项(这里是 'o1')
#select.select_by_visible_text('o1')
#使用 <option> 元素的 value 属性值来选择指定选项,这里是 'o4val'
select.select_by_value('o4val')
sleep(2)
driver.close()
级联选择器定位:
网址: https://www.iviewui.com/view-ui-plus/component/form/cascader
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.iviewui.com/view-ui-plus/component/form/cascader')
driver.maximize_window()
driver.find_element(By.XPATH, '//div[@class="ivu-input-wrapper ivu-input-wrapper-default ivu-input-type-text"]/input[@type="text"and@placeholder="请选择"]').click()
sleep(1)
driver.find_elements(By.XPATH, '//li[contains(text(),"江苏")]')[0].click()
sleep(1)
driver.find_element(By.XPATH, '//li[contains(text(),"苏州")]').click()
sleep(1)
driver.find_elements(By.XPATH, '//li[contains(text(),"狮子林")]')[0].click()
sleep(2)
driver.close()
日期选择器定位:
三种弹框形式实战(Alert,confirm,prompt)
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://sahitest.com/demo/alertTest.htm')
driver.maximize_window()
driver.find_element(By.NAME, 'b2').click()
sleep(2)
#driver.switch_to.alert 用于定位当前页面上的弹窗
#accept() 方法用于点击弹窗上的“确定”或“接受”按钮,关闭弹窗
driver.switch_to.alert.accept()
sleep(2)
driver.close()
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://sahitest.com/demo/confirmTest.htm')
driver.maximize_window()
driver.find_element(By.NAME, 'b1').click()
sleep(2)
print(driver.switch_to.alert.text)
#accept()接收
driver.switch_to.alert.accept()
sleep(2)
driver.find_element(By.NAME, 'b1').click()
sleep(2)
print(driver.switch_to.alert.text)
#dismiss取消
driver.switch_to.alert.dismiss()
sleep(2)
driver.close()
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://sahitest.com/demo/promptTest.htm')
driver.maximize_window()
driver.find_element(By.NAME, 'b1').click()
sleep(2)
driver.switch_to.alert.send_keys("原神启动")
print(driver.switch_to.alert.text)
driver.switch_to.alert.accept()
sleep(2)
driver.find_element(By.NAME, 'b1').click()
sleep(2)
driver.switch_to.alert.send_keys("原神不启动")
print(driver.switch_to.alert.text)
driver.switch_to.alert.dismiss()
sleep(2)
driver.close()
文件上传upload:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from utils.get_filepath import get_filepath
driver = webdriver.Chrome()
driver.get('https://sahitest.com/demo/php/fileUpload.htm')
driver.maximize_window()
#文件路径我们要用相对的路径,因为每个人的电脑文件存储存储位子是不一样的
path = get_filepath()
upload = driver.find_elements(By.ID,'file')[0]
#send_keys 方法可以模拟用户在文件选择器中选择文件的操作,将文件路径(由变量 path 提供)输入到文件上传控件中
#r"{}".format(path) 的格式化语句确保路径以原始字符串的形式传入,避免转义字符影响
upload.send_keys(r"{}".format(path))
sleep(2)
driver.find_elements(By.NAME,'submit')[0].click()
sleep(2)
driver.close()
get_filepath()方法:

上面的图片是需要上传文件的目录层级,每个人的相对目录层级不一样,需要对照自己的目录层级修改。下面是我的代码参考:
import os
def get_filepath():
#获取当前文件的绝对路径:os.path.realpath(__file__)
#定位上一级目录:os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
#拼接目标路径:os.path.join(..., "file", "实习证明.docx")
path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),"file","实习证明.docx")
return path
iframe:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://sahitest.com/demo/iframesTest.htm')
driver.maximize_window()
#先定位到 ID 为 checkRecord 的输入框,并清空其中的已有内容
driver.find_element(By.CSS_SELECTOR,'input[id="checkRecord"]').clear()
#再次定位到同一个输入框,并输入内容 "666"
driver.find_element(By.CSS_SELECTOR,'input[id="checkRecord"]').send_keys("666")
sleep(3)
#通过下标
#将浏览器的上下文切换到页面中的第2个 iframe(索引从0开始)
#在切换之后,后续代码将只能访问该 iframe 内的元素,而无法直接操作主页面上的元素
driver.switch_to.frame(1)
driver.find_element(By.CSS_SELECTOR,'a[href="index.htm"]').click()
sleep(5)
driver.close()
更多推荐
所有评论(0)