1.什么是selenium
首先,老生常谈的来段定义:selenium 自动化测试浏览器,它主要是用于 Web 应用程序的自动化测试,但肯定不只局限于此,同 时支持所有基于 web 的管理任务自动化。
本质上就是python中UI自动化所用的一个模块,用来和浏览器进行交流的一个工具,而且它免费,直接在pycharm中可以安装,一般在控制台中输入就可以直接安装。
pip install selenium
当然很多时候这样会很慢,或者直接失败,因为网络的原因,所以推荐在python中安装包的话使用国内的镜像,比方说清华大学的
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
selenium是一个很大的家族,而对于UI自动化来讲,主要就是使用的WebDriver,相当于模拟人工在页面进行点击操作。
这就引伸到一个使用范围了,正常情况下都是公司固定项目进行自动化,还包括一些
1)任务测试明确,不会频繁变动,一些固定的项目内容
2)需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务
3)项目进度压力不太大
这些都可以进行自动化测试,举个实例,一个项目,某个模块经常有改动,可能会导致其他模块出现问题,这时候你不能花大量时间去做功能验证,使用自动化就是个很好的选择
2.selenium需要掌握的一些使用点
1)浏览器的基本操作
从刚开始的打开浏览器、网页、截屏、页面切换、刷新、休眠、退出、设置窗口大小
from selenium import webdriver
import time
import datetime
import os
#唤起浏览器
driver = webdriver.Chrome()
#调用网页,如百度
driver.get("https://www.baidu.com")
#截屏命名为当前时间
# 保存截图到指定路径,命名为当前时间戳
timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
screenshot_name = f"{timestamp}.png"
#创建文件夹
save_path = r"C:/Users/L/Desktop/测试使用/"
if not os.path.exists(save_path):
os.makedirs(save_path)
else:
pass
#截屏
driver.get_screenshot_as_file(r"C:/Users/L/Desktop/测试使用/" + screenshot_name)
time.sleep(2)
#设置窗口大小 1024*768
driver.set_window_size(1024, 768)
#窗口最大化
driver.maximize_window()
#设置休眠
time.sleep(5)
#关闭当前窗口
driver.close()
#关闭整个进程
driver.quit()
这里面,附加了一个os模块的应用,这个模块后续应该会单独出一期进行讲解,大致就是提供与操作系统交互的接口的模块,可以在文件系统中执行各种操作,比如文件和目录的创建、删除、重命名等;datetime模块, Python 标准库中用于处理日期和时间的模块,它提供了许多函数和类来操作日期、时间和时间间隔;time模块,Python 标准库中用于处理时间的模块,提供了许多与时间相关的函数。
2)元素定位
可以说,selenium自动化的一个核心的地方就是元素定位,学会了元素定位,那么基本的UI自动化跑起来就没有什么问题了,一般来说,定位的元素,主要有以下几类:
id、name、class name、tag name、link text 、partial link text、xpath、css selector
在日常的项目中,用的比较多的就是classname、xpath使用,个人感觉直接使用xpath是比较方便的方式。
以百度为例(www.baidu.com),输入框元素为
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">那么对应的id定位 :
driver.find_element_by_id("kw")
一般输入框都会进行一个文字的输入,同时我们还会加上一个等待时间,让浏览器能够加载出来
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
#唤起浏览器
driver = webdriver.Chrome()
#调用网页,如百度
driver.get("https://www.baidu.com")
time.sleep(2)
#找到输入框并输入天下进行搜索
driver.find_element(By.ID,"kw").send_keys("天下")
time.sleep(2)
print("已找到")
需要注意的是,之前的版本可以支持driver.find_element_by_id("kw").send_keys("天下")的写法,目前截止笔者更新的时间来说,大多数版本的selenium都已经不支持这种写法了,更改为了driver.find_element(By.ID,"XXX")的语法。同理也可以得到输入框其他元素相应的写法了,这里就不一一写出了。
基于此,也可以进行一些其他的书写,如:
find_case = driver.find_element(By.ID, "kw")
find_case.send_keys("天下")
都属于一样的东西,建议能简略的写,就写简略一点,同时,这里其实也可以进行一个爬虫的操作,例如爬取百度界面的热搜部分:
find_case = driver.find_element(By.CLASS_NAME, "title-content-title").text
print(find_case)
但是运行上面的代码只能得到这一个数据:
原因是因为返回的是一个元素列表,但是显示时就只展示了列表的第一项,所以我们只需要加上一个遍历,遍历这个列表获取每个元素的文本内容,就可以完整的显示出这个热搜榜了
find_case = driver.find_elements(By.CLASS_NAME, "title-content-title")
for case in find_case:
print(case.text)
driver.quit()
此时,输出结果为
这样就把数据都打印下来了,在使用driver.find_element和driver.find_elements注意使用场景,再决定要不要加上s;一般来说使用
driver.find_element
来获取单个元素,并在确定只需要处理一个元素时使用,使用
driver.find_elements
来查找多个匹配的元素,以便对它们进行批量操作。
值得注意的是,正常情况下:
**
driver.find_element
**:
- 这个方法会查找页面上符合指定定位方式(如通过类名、ID、标签名等)和定位值的第一个元素。
- 如果未找到匹配的元素,会抛出
NoSuchElementException
异常。
**
driver.find_elements
**:
- 这个方法会查找页面上所有符合指定定位方式和定位值的元素,并返回一个元素列表(
list
)。 - 如果未找到匹配的元素,会返回一个空列表,不会引发异常。
除此之外就是使用xpath进行定位,写法上几乎没有什么不同。
#找到输入框并输入天下进行搜索
driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("天下")
driver.quit()
使用xpath进行查找的时候,可以先在浏览器上进行确认,保证所选用的xpath唯一
对于一些存在链接的文本点击跳转:
#点击链接文本
driver.find_element(By.LINK_TEXT,"乱港分子回香港时被拒绝入境当场痛哭,还敢自揭回港“搞事”").click()
总的来说,find_element的方式主要就是找到对应元素,然后进行点击操作。
还有一个就是css定位,同样的使用的是find_element:
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("天下")
time.sleep(5)
不一样的是,在css中不用去判断属性类型,直接都是css_selector ,但是后面的值需要做类型验证具体的分类如下,具体使用哪种,看个人喜好:
通过类名定位元素
element = driver.find_element(By.CSS_SELECTOR, ".class-name")
通过ID定位元素
element = driver.find_element(By.CSS_SELECTOR, "#element-id")
通过属性定位元素
element = driver.find_element(By.CSS_SELECTOR, "[attribute='value']")
通过组合多个属性定位元素
element = driver.find_element(By.CSS_SELECTOR, "[attribute1='value1'][attribute2='value2']")
通过部分属性值匹配来定位元素
element = driver.find_element(By.CSS_SELECTOR, "[attribute^='value']") # 开头匹配
element = driver.find_element(By.CSS_SELECTOR, "[attribute$='value']") # 结尾匹配
element = driver.find_element(By.CSS_SELECTOR, "[attribute*='value']") # 包含匹配
3)常见的浏览器事件
对于一个复杂的系统,经常会遇到一些事件,例如:悬浮框、拖拽元素、下拉框等等,这里就列举一些比较常见的类型以供参考:
点击元素:
element.click()
输入文本:
element.send_keys("Your text")
清除输入框:
element.clear()
提交表单:
element.submit()
下拉菜单选择:
from selenium.webdriver.support.ui import Select
select = Select(element)
select.select_by_visible_text("Option")
鼠标悬停:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(element).perform()
双击元素:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).double_click(element).perform()
拖拽元素:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).drag_and_drop(element, target).perform()
键盘操作:
element.send_keys(Keys.ENTER)
验证元素可见:
element.is_displayed()
等待元素出现:
from selenium.webdriver.support.ui import WebDriverWait
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "element_id")))
获取元素属性:
element.text
执行 JavaScript:
driver.execute_script("alert('Hello World')")
切换窗口:
driver.switch_to.window(window_handle)
处理弹出框:
alert = driver.switch_to.alert
alert.accept()
版权归原作者 qq_45319363 所有, 如有侵权,请联系我们删除。