0


自学Python+Selenium自动化测试

    俗话说的好,书读百遍不如手过一遍,而编程这东西是看书看视频一万遍都不如你自己多敲代码、写脑图、总结分享转换成自己的内容来的实在。

    今天我就把最近学的(二)**Selenium核心WebDriver API**简单总结一下,方便自己以后找出来看看。

一、页面元素定位、操作

1、页面元素

    (1)在浏览器能显示的所有要素:****图片、链接、文本框、按钮、下拉列表、视频****

2、元素的定位方式

**** id****(find_element(value="id值")、默认是by=By.ID可以不写)

    ****name****(find_element(by=By.****NAME****, value="name值"))

    ****class name****(find_element(by=By.****CLASS_NAME****, value="class值"))

    ****tag name****(find_element(by=By.****TAG_NAME****, value="标签名")、重复性太高)

    ****link text****(find_element(by=By.****LINK_TEXT****, value="链接显示文本"))

    ****partial link text****(find_element(by=By.****PARTIAL_LINK_TEXT****, value="部分链接显示文本"))

    ****xpath****(find_element(by=By.****XPATH****, value="xpath值")、xpath是xml中定位元素的语言、绝对路径(/html/body/.../input)、元素属性(//input[@id='kw'])、层级与属性结合(//*[@id='su'])、逻辑运算符)

    ****css selector****(find_element(by=By.****CSS_SELECTOR****, value="css值")、CSS选择器、.class、#id、*、element、element>element、element+element、[attribute=value])

3、元素的操作方法

    ****clear()****:清除文本

**** send_keys(value)****:模拟按键输入值(追加、发送字符串、发送快捷键)

**** click()****:单击元素(按钮、超链接、单选框、复选框)

**** current_url****:返回当前页面的url地址

**** title****:返回当前页面的标题title

**** text****:获取页面(提示框、警告框)显示的文本

**** get_attribute(name)****:获取属性值:界面上展示的文本内容使用value属性名、 没有在界面展示文本内容使用innerText/textContent属性名、获取包含元素的HTML文本使用outerHTML、获取不含元素的HTML使用innerHTML

**** is_dispalyed()****:设置该元素是否用户可见

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/27 15:33
# software: PyCharm

"""
定位元素8种方式:driver.find_element(By.属性, "值").操作方法
    1、ID属性:百度文本框ID值为ke、百度一下按钮ID值为su
    1、NAME属性:百度文本框NAME值为wd
    3、CLASS_NAME属性:百度文本框CLASS值为s_ipt
    4、TAG_NAME属性:百度文本框的标签名为input,但是页面有相同标签名,所以报错
    5、LINK_TEXT属性:链接名为百度首页
    6、PARTIAL_LINK_TEXT属性:链接名包含内容有大会这些亮点
    7、XPATH属性:
        (1)绝对路径:/(根节点)、//(相对节点)、[1](标签名同名为兄弟节点、数字代表顺序、≥1、2个以上的兄弟节点需要写1)
        输入框的绝对路径(完整路径):/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input
        (2)元素属性
        输入框://input[@maxlength='255']
        (3)层级与属性结合
        百度一下按钮://form[@id='form']/span[2]/input
        (4)逻辑运算符and、or
        百度热搜第一条://a[@target='_blank' and @title='数据说话:中国经济稳定性何来?']
    8、CSS_SELECTOR属性:
        (1).class
        百度首页链接的样式:.toindex
        (2)#id
        输入框id:#kw
        (3)*
        所有元素中通过id属性选百度一下按钮:*[id='su']
        (4)element
        a元素中通过class属性选百度首页链接:a[class='toindex']
        (5)element>element
        span标签下的input标签确定输入框:span>input
        (6)element+element
        input标签后所有i标签确定输入框后的清空:input+i
        (7)[attribute=value]→[attribute^=value]以值开头、[attribute$=value]以值结尾、[attribute*=value]含有值、
    [attribute~=value]含有单独值、[attribute|=value]值右边可以有可以没有值
        class属性的值为toindex确定百度首页链接:[class='toindex']
元素的操作方法:
    driver.find_element(元素).clear():清除文本
    driver.find_element(元素).send_keys(value):模拟按键输入值
    driver.find_element(元素).click():单击元素(按钮操作、点击链接)
    driver.current_url:返回当前页面的url地址
    driver.title:返回当前页面的标题title
    driver.find_element(元素).text:获取页面(提示框、警告框)显示的文本
    driver.find_element(元素).get_attribute(name):获取属性值:界面上展示的文本内容使用value属性名、
没有在界面展示文本内容使用innerText/textContent属性名、获取包含元素的HTML文本使用outerHTML、获取不含元素的HTML使用innerHTML
    driver.find_element(元素).is_dispalyed():判断该元素是否用户可见
    driver.find_element(元素).is_enabled():判断该元素是否可用
    driver.find_element(元素).is_selected():判断该元素是否被选中(单选框、复选框)
"""
import time
from urllib import parse

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

# 创建浏览器对象
driver = webdriver.Edge()
# 跳转到百度页面
driver.get("https://www.baidu.com")
# 通过输入框的ID属性在框内输入值
driver.find_element(value="kw").send_keys("selenium")
time.sleep(1)
# 通过百度一下按钮的ID属性点击按钮
driver.find_element(By.ID, "su").click()
time.sleep(2)
# 通过输入框的NAME属性清空框内值
driver.find_element(By.NAME, "wd").clear()
time.sleep(1)
# 通过输入框的样式属性在框内输入值
driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("selenium")
time.sleep(1)
# 使用tag name定位报错:selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
# driver.find_element(By.TAG_NAME, "input").click()
# time.sleep(1)
# 使用link text定位报错:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate
# element: {"method":"link text","selector":"百度首页"}。解决方法:重新编写这句代码
driver.find_element(By.LINK_TEXT, "百度首页").click()
time.sleep(1)
# driver.find_element(By.PARTIAL_LINK_TEXT, "中国网络文明大会这些亮点别错过").click()
driver.find_element(By.PARTIAL_LINK_TEXT, "文明建设").click()
time.sleep(1)

# 获取最新的窗口句柄列表,切换到当前窗口
driver.switch_to.window(driver.window_handles[-1])

# xpath-绝对路径:/(根节点)、//(相对节点)、[1](标签名同名为兄弟节点、数字代表顺序、≥1、2个以上的兄弟节点需要写1)
driver.find_element(By.XPATH, "/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input").clear()
time.sleep(1)
# xpath-元素属性
driver.find_element(By.XPATH, "//input[@maxlength='255']").send_keys("selenium")
time.sleep(1)
# xpath-层级与属性结合
driver.find_element(By.XPATH, "//form[@id='form']/span[2]/input").click()
time.sleep(2)
# xpath-逻辑运算符
driver.find_element(By.XPATH, "//a[@target='_blank' and @title='数据说话:中国经济稳定性何来?']").click()
time.sleep(1)

# 获取最新的窗口句柄列表,切换到当前窗口
driver.switch_to.window(driver.window_handles[-1])

# 输出当前页面的url地址
url = driver.current_url
# urlencode():将中文字典转换为url编码
wd = parse.urlencode({"wd": "数据说话:中国经济稳定性何来?"})
# urlparse:将URL解析成ParseResult对象(协议(scheme)、域名(netloc)、路径(path)、路径参数(params)、查询参数(query)、片段(fragment))
# parse_qs:将查询参数转换为字典格式
wd_cn = parse.parse_qs(parse.urlparse(url).query)['wd']
# unquote():将url编码转换为中文
cn_wd = parse.unquote("".join(wd_cn))
# 判断页面url中搜索文本参数、页面标题是否一致
if url.find(wd) and (cn_wd[:4] == driver.title[:4]):
    print(f"{driver.title}---{url}")
else:
    print("没有跳转到今日热搜第一条:数据说话:中国经济稳定性何来?")

# 获取页面文本信息
text = driver.find_element(By.CSS_SELECTOR, "#tsn_inner > div:nth-child(2) > span").text
print(f"text:{text}")

# 获取属性值
value = driver.find_element(By.ID, "kw").get_attribute("value")
print(f"get_attribute---{value}")
value0 = driver.find_element(By.ID, "su").get_attribute("class")
print(f"get_attribute---class={value0}")

# 判断元素是否用户可见、是否可用
whether = driver.find_element(By.ID, "su").is_displayed()
whether0 = driver.find_element(By.ID, "su").is_enabled()
if whether and whether0:
    print("百度一下按钮显示可用")
else:
    print("百度一下按钮显示失败")

# CSS选择器(class选择器):.class
driver.find_element(By.CSS_SELECTOR, ".toindex").click()
time.sleep(1)
# CSS选择器(id选择器):#id
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("selenium")
time.sleep(1)
# CSS选择器(所有):*
driver.find_element(By.CSS_SELECTOR, "*[id='su']").click()
time.sleep(2)
# CSS选择器(某个元素或某个标签名):element
driver.find_element(By.CSS_SELECTOR, "a[class='toindex']").click()
time.sleep(1)
# CSS选择器(父元素下的所有的某元素):element>element
driver.find_element(By.CSS_SELECTOR, "span > input").send_keys("selenium")
time.sleep(1)
# CSS选择器(同级元素后的所有的某元素):element+element
driver.find_element(By.CSS_SELECTOR, "input + i").click()
time.sleep(1)
# CSS选择器(选择某个键值):[attribute=value]
driver.find_element(By.CSS_SELECTOR, "[class='toindex']").send_keys("selenium")
time.sleep(1)
# 关闭当前窗口
driver.close()
time.sleep(1)
# 退出驱动程序和每个相关窗口
driver.quit()

二、浏览器操作

1、控制窗口大小

**** set_window_size(width,height)**** #设置窗口大小

**** minimize_window() ****#窗口最小化

**** maximize_window()**** #窗口最大化

2、控制后退、前进

**** back()**** #回退到上一个页面

**** forward()**** #前进到下一个页面

3、模拟浏览器刷新

**** refresh()**** #刷新页面

4、截屏

**** save_screenshot("保存地址\图片名.图片格式")****

**** get_screenshot_as_file("保存地址/图片名.图片格式")****

5、模拟关闭

**** close()**** #关闭当前窗口

**** quit()**** #退出驱动程序和每个相关窗口


三、鼠标、键盘操作

1、鼠标

**** ActinoChains(driver)**** #常用语模仿鼠标的行为,如单击、双击、拖拽等行为。都是针对页面元素进行操作

**** context_click()**** #右击

**** dpuble_click()**** #双击

**** drag_and_drop()**** #拖动

**** move_to_element()**** #鼠标悬停

**** perform()**** #执行所有ActionChains中存储的行为

2、键盘

**** Keys()**** #模仿键盘行为,如单键、组合键,多次行为* num

**** Keys.BACK_SPACE**** #删除键

**** Keys.SPACE**** #空格键

**** Keys.TAB**** #制表键

**** Keys.ESCAPE ****#ESC键

**** Keys.ENTER ****#回车键

**** Keys.CONTROL, 'A'**** #ctrl+A|C|X|V:全选、复制、剪切、粘贴

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/29 19:53
# software: PyCharm

"""
浏览器的操作方法:
    driver.set_window_size(width=值,height=值)  # 设置窗口大小
    driver.minimize_window()  # 窗口最小化
    driver.maximize_window()  # 窗口最大化
    driver.back()  # 回退到上一个页面
    driver.forward()  # 前进到下一个页面
    driver.refresh()  # 刷新页面
    driver.save_screenshot("保存地址\\图片名.图片格式")  # 截屏
    driver.get_screenshot_as_file("保存地址/图片名.图片格式")  # 截屏
    driver.switch_to.window(driver.window_handles[列表下标])  # 获取句柄列表,切换到某个窗口
    driver.close()  # 关闭当前窗口
    driver.quit()  # 退出驱动程序和每个相关窗口
鼠标的操作方法:
    ActinoChains(driver)  # 常用于模仿鼠标的行为,如单击、双击、拖拽等行为
    perform()  # 执行所有ActionChains中存储的行为
    ActionChains(driver).context_click(元素).perform()  # 右击
    ActionChains(driver).double_click(元素).perform()  # 双击
    ActionChains(driver).drag_and_drop(来源, 目标).perform()  #拖动
    ActionChains(driver).move_to_element(元素).perform()  # 鼠标悬停
键盘的操作方法:
    Keys()  # 模仿键盘行为,如单键、组合键,多次行为* num
    Keys.BACK_SPACE  # 删除键
    Keys.SPACE  # 空格键
    Keys.TAB  # 制表键
    Keys.ESCAPE  # ESC键
    Keys.ENTER  # 回车键
    Keys.CONTROL, 'A'  # ctrl+A|C|X|V:全选、复制、剪切、粘贴
"""
import time

from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By

# 创建浏览器对象
driver = webdriver.Edge()
# 跳转到百度页面
driver.get("http://news.baidu.com")
# 通过判断对需要留存的页面进行截屏
driver.save_screenshot(r"..\screenshot\test_driver.png")
# 窗口最大化
driver.maximize_window()
time.sleep(1)
# 通过判断对需要留存的页面进行截屏
driver.get_screenshot_as_file("../screenshot/test_driver_1.png")
# 窗口最小化
driver.minimize_window()
time.sleep(1)
# 通过判断对需要留存的页面进行截屏
driver.get_screenshot_as_file("{}.{}".format("..\\screenshot\\test_driver_2", "png"))
# 设置窗口大小
driver.set_window_size(1280, 1000)
time.sleep(1)
# 通过CSS定位器中的样式定位到百度首页并跳转
driver.find_element(by=By.CSS_SELECTOR, value="#usrbar > ul > li:nth-child(4) > a").click()
# 获取页面中的设置元素
set_ddlist = driver.find_element(value="s-usersetting-top")
# 鼠标悬停到设置上显示不同设置
ActionChains(driver).move_to_element(set_ddlist).perform()
time.sleep(0.5)
# 获取页面中的文本框元素
text_box = driver.find_element(value="kw")
# 鼠标右击文本框显示文本框操作菜单
ActionChains(driver).context_click(text_box).perform()
time.sleep(0.5)
# 获取换一换元素
hyh = driver.find_element(by=By.CSS_SELECTOR, value=".hot-refresh-text")
# 双击换一换切换百度热搜
ActionChains(driver).double_click(hyh).perform()
time.sleep(1)
# 获取百度热搜第4条内容(第2行第2列)
baidu_logo = driver.find_element(by=By.XPATH, value="//*[@id='hotsearch-content-wrapper']/li[4]/a/span[2]")
# 将热搜内容拖拽到文本框中
ActionChains(driver).drag_and_drop(baidu_logo, text_box).perform()
time.sleep(0.5)
# 在文本框中输入内容
text_box.send_keys("selenium")
time.sleep(0.5)
# 全选文本框内容
text_box.send_keys(Keys.CONTROL, 'A')
time.sleep(0.5)
# 复制文本框内容
text_box.send_keys(Keys.CONTROL, 'C')
time.sleep(0.5)
# 剪切文本框内容
text_box.send_keys(Keys.CONTROL, 'X')
time.sleep(0.5)
# 粘贴文本框内容
text_box.send_keys(Keys.CONTROL, 'V')
time.sleep(0.5)
# 删除文本框内容的最后一个字
text_box.send_keys(Keys.BACK_SPACE)
time.sleep(0.5)
# 文本框内容最后添加空格
text_box.send_keys(Keys.SPACE)
time.sleep(0.5)
# 退出文本框预测内容
text_box.send_keys(Keys.ESCAPE)
time.sleep(0.5)
# 切换光标到资讯
text_box.send_keys(Keys.TAB * 2)
time.sleep(0.5)
# 通过回车键进行搜索
text_box.send_keys(Keys.ENTER)
time.sleep(1)
# 回退到上一个页面
driver.back()
time.sleep(1)
# 前进到下一个页面
driver.forward()
time.sleep(1)
# 获取最新的窗口句柄列表,切换到当前窗口
driver.switch_to.window(driver.window_handles[-1])
# 关闭当前窗口
driver.close()
# 关闭驱动程序和所有窗口
driver.quit()

上述代码中的三张截图效果展示


四、警告窗口处理

1、在WebDriver中处理JavaScript所生成的警告模式窗口(alert警告框、confirm确认框、prompt提示框

**** 模式窗口****:不关闭此窗口,其他操作无法进行

    非模式窗口:此窗口不影响其他操作进行

2、从浏览器窗口切换到警告窗口

    alert = ****driver.switch_to.alert****  #临时切换到警告

    confirm = driver.witch_to.alert  #临时切换到确认框

    prompt = driver.witch_to.alert  #临时切换到提示框

3、对警告窗口操作

    msg = alert****.text****  #返回窗口中的文本信息

    alert****.accept()****  #接受现有警告窗口(点击确定按钮)

    alert****.dismiss()****  #放弃现有警告窗口(点击取消按钮)

**** prompt.send_keys()**** #发送文本至警告窗口(仅提示框)


五、多窗口、多表单处理

1、多窗口

    list = ****driver.window_handles**** #获取窗口句柄列表

    driver.switch_to.window(driver.window_handles[列表下标]) #获取句柄列表,切换到某个窗口

2、多表单

    frame、iframe表单内嵌页面上的元素无法直接定位

**** driver.switch_to.frame("frame_name")**** #通过name属性

**** driver.switch_to.frame(1)**** #通过frame、iframe索引

**** driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0])**** #通过frame、iframe表单元素

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/30 19:09
# software: PyCharm

"""
多表单处理:
    frame、iframe表单内嵌页面上的元素无法直接定位
    driver.switch_to.frame("frame_name") # 通过name属性
    driver.switch_to.frame(1) # 通过frame、iframe索引
    driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0) # 通过frame、iframe表单元素
"""
import time

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

# 创建浏览器对象
driver = webdriver.Edge()
driver.set_window_size(1180, 1000)
# 跳转到百度页面
driver.get("https://www.qq.com/")
# 点击邮箱图表进入邮箱登录界面
driver.find_element(by=By.LINK_TEXT, value="Qmail").click()
# 多窗口处理:通过窗口句柄切换到当前QQ邮箱页面
driver.switch_to.window(driver.window_handles[-1])
# 多表单处理:通过name属性切换到frame、iframe表单内嵌页面
# driver.switch_to.frame("login_frame")
# 多表单处理:通过索引切换到frame、iframe表单内嵌页面(微信和QQ登录各有一个iframe表单)
# driver.switch_to.frame(1)
# 多表单处理:通过frame、iframe表单元素切换到frame、iframe表单内嵌页面(微信和QQ登录各有一个iframe表单)
driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[-1])
time.sleep(0.5)
# 输入QQ邮箱和密码
driver.find_element(value="u").send_keys("[email protected]")
time.sleep(0.5)
driver.find_element(value="p").send_keys("123456")
time.sleep(0.5)
# 点击登录
driver.find_element(value="login_button").click()
time.sleep(0.5)
# 关闭程序和窗口
driver.quit()

六、时间等待

1、强制等待

**** time.sleep(5)**** #线程等待固定时间5秒

2、隐式等待

**** driver.implicitly_wait(time_to_wait)**** #智能等待(全局、优先于显式等待、定位到元素直接执行、超时则抛出异常、适用于加载较慢的页面)、time_to_wait最大等待时间(此阶段会不断刷新页面)

3、显式等待

**** wait.WebDriverWait(driver, timeout,** poll_frequency=0.5).until(method,** info********)**** #等待某个元素的出现或某个元素的可点击、超时则抛出异常、timeout最长等待时间30秒、poll_frequency默认每隔0.5秒检测一次、expected_conditions判断条件alert_is_present页面存在警告框、presence_of_element_located()页面存在的元素

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/30 10:12
# software: PyCharm

"""
警告窗口处理:
    (1)在WebDriver中处理JavaScript所生成的警告模式窗口(alert警告框、confirm确认框、prompt提示框)
    模式窗口:不关闭此窗口,其他操作无法进行
    非模式窗口:此窗口不影响其他操作进行
    (2)从浏览器窗口切换到警告窗口
    alert = driver.switch_to.alert  # 临时切换到警告框
    confirm = driver.witch_to.alert  # 临时切换到确认框
    prompt = driver.witch_to.alert  # 临时切换到提示框
    (3)对警告窗口操作
    msg = alert.text  # 返回窗口中的文本信息
    alert.accept()  # 接受现有警告窗口(点击确定按钮)
    alert.dismiss()  # 放弃现有警告窗口(点击取消按钮)
    prompt.send_keys()  # 发送文本至警告窗口(仅提示框)
时间等待:
    (1)强制等待
    time.sleep(5) #线程等待固定时间5秒
    (2)隐式等待
    driver.implicitly_wait(time_to_wait) #智能等待(全局、优先于显式等待、定位到元素直接执行、超时则抛出异常)、time_to_wait最大等待时间(此阶段会不断刷新页面)
    (3)显式等待
    wait.WebDriverWait(driver, timeout, poll_frequency=0.5).until(method, info)
    #等待某个元素的出现或某个元素的可点击、超时则抛出异常、timeout最长等待时间30秒、poll_frequency默认每隔0.5秒检测一次、
expected_conditions判断条件、alert_is_present页面存在警告框、presence_of_element_located()页面存在的元素
"""
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
# from selenium.webdriver.support import wait, expected_conditions  # 显示等待时导入的包

# 创建浏览器对象
driver = webdriver.Edge()
# 隐式等待:智能等待、time_to_wait最大等待时间
driver.implicitly_wait(5)
# 跳转到百度页面
driver.get("https://www.selenium.dev/zh-cn/documentation/webdriver/browser/alerts/")
# 显示等待:timeout最长等待时间30秒、poll_frequency默认每隔0.5秒检测一次、expected_conditions判断条件、alert_is_present是页面存在警告框
# wait.WebDriverWait(driver, 30, ignored_exceptions=None).until(expected_conditions.presence_of_element_located(
#     By=ID, "alerts-警告框"), "timeout")
# 点击查看样例警告框
driver.find_element(by=By.LINK_TEXT, value="查看样例警告框").click()
# 强制等待:固定时间1秒
time.sleep(1)
# 临时将窗口对象从浏览器窗口切换到警告框
alert = driver.switch_to.alert
# 获取警告框中的文本信息
alert_msg = alert.text
print(f"警告信息:{alert_msg}")
# 点击警告框确定按钮
alert.accept()
time.sleep(1)

# 点击查看样例确认框
driver.find_element(by=By.LINK_TEXT, value="查看样例确认框").click()
time.sleep(1)
# 临时将窗口对象从浏览器窗口切换到确认框
confirm = driver.switch_to.alert
# 获取确认框中的文本信息
confirm_msg = confirm.text
print(f"确认信息:{confirm_msg}")
# 点击确认框取消按钮
confirm.dismiss()
time.sleep(1)

# 点击查看样例提示框
driver.find_element(by=By.LINK_TEXT, value="查看样例提示框").click()
time.sleep(1)
# 临时将窗口对象从浏览器窗口切换到提示框
prompt = driver.switch_to.alert
# 获取提示框中的文本信息
prompt_msg = prompt.text
print(f"提示信息:{prompt_msg}")
# 向提示框发送文本信息、注意:这里不起作用
prompt.send_keys("简单测试一下可以吗")
time.sleep(1)
# 点击警提示框确定按钮
prompt.accept()
time.sleep(1)

# 退出程序关闭窗口
driver.close()

    愿你我都能为中华民族的伟大复兴尽一份绵薄力量,让中华文化的根扎根在中国这片绿水青山之上,让新一代中华儿女传承与发扬!!!

---无名之辈


以上内容均是本人自学,当然是有网上公布的内容,如有冒犯,请留言,立即改正,谢谢!


    看完要是觉得对自己有用,动一下您那根金色的会一指禅的右手食指,按一下您的鼠标左键,在对应的那个位置点个赞,亦或者在评论区留下您的绝顶好句,亦或者收藏在您的收藏夹里,再走也不迟嘛!您说要不要得!谢谢您的阅读和赞赏!

本文转载自: https://blog.csdn.net/bigbear_001/article/details/126713113
版权归原作者 bigbear_001 所有, 如有侵权,请联系我们删除。

“自学Python+Selenium自动化测试”的评论:

还没有评论