学习WEB自动化测试第二天

一、常见的各种元素选择器

我们要对页面进行操作就要告诉代码应该去执行哪个,这个时候我们就要通过HTML页面的标签元素来告诉代码我们要操作的对象,关于选择器,有一下几种选择器:

1. By ID
使用元素的唯一标识符 (id 属性) 来选择元素

element = driver.find_element(By.ID, "element_id")

2. By Name
根据元素的 name 属性选择元素,通常用于表单元素

element = driver.find_element(By.NAME, "element_name")

3. By Class Name
通过元素的 class 属性选择元素,适用于有相同类名的多个元素

element = driver.find_element(By.CLASS_NAME, "element_class")

4. By Tag Name
根据元素的标签名选择元素,例如选择所有的 <a> 标签

element = driver.find_element(By.TAG_NAME, "a")

5. By Link Text
使用超链接文本来选择 <a> 标签元素

element = driver.find_element(By.LINK_TEXT, "link_text")

6. By Partial Link Text
通过部分超链接文本选择元素,适用于文本内容较长的链接

element = driver.find_element(By.PARTIAL_LINK_TEXT, "partial_link_text")

7. By CSS Selector
使用 CSS 选择器来选择元素,这种方法非常灵活,可以选择任何符合条件的元素

element = driver.find_element(By.CSS_SELECTOR, ".class_name #id")

8. By XPath
使用 XPath 表达式选择元素,适用于复杂的查询条件

element = driver.find_element(By.XPATH, "//div[@class='class_name']")

9. By Tag Name (Multiple Elements)
返回一个包含多个元素的列表,比如所有的 <input> 标签

elements = driver.find_elements(By.TAG_NAME, "input")

这里是建议用CSS和XPath来定位,CSS定位方法比较稳定,一般更新某些页面的时候很少对CSS样式进行更改,所以CSS定位方法更加稳定,如果想要更快的定位可以用 ID 来定位,缺点是页面更新后ID可能会变,不利于自动化程序的后续重复使用

小技巧:

我们在用CSS定位时找起来比较麻烦不太方便,这时候我们就可以直接复制,方法如下:

这里我们以 Bing 为例

这里假如我们想要“图片”的CSS地址,我们先找到他的位置,然后这一行右键,选择Copy,再选择Copy selector 就可以直接获取到CSS的定位值,直接复制到代码中即可

XPath同样可以这样操作,我们只要在Copy处选择Copy XPath即可

二、设置延迟方法

首先为什么要设置延迟?

设置延迟是为了确保浏览器有足够的时间加载页面和元素,从而避免脚本在页面未完全加载时尝试与页面元素交互

1. 确保页面加载完成
当一个页面较大或者网络速度较慢时,页面元素可能需要时间加载。立即尝试操作这些元素可能会导致错误
2. 等待动态内容
现代网页往往使用 JavaScript 动态加载内容,可能需要时间更新页面。在这种情况下,延迟可以确保这些动态内容加载完成,避免脚本操作无效的元素
3. 避免脚本崩溃
如果在页面加载完成之前尝试与元素交互,可能会抛出 NoSuchElementException 或者其他异常。通过设置延迟,能够降低脚本崩溃的风险
4. 同步与服务器的响应时间
某些操作(如提交表单或点击按钮)可能需要等待服务器的响应。如果立即执行下一步操作,可能会因为服务器响应未到而导致错误
5. 模拟用户行为
在某些测试场景中,延迟可以模拟真实用户的行为,从而更准确地测试系统的性能和响应能力

常用的设置延迟方法

1. 隐式等待
用法: 通过设置一个全局等待时间,让WebDriver在查找元素时等待一定时间,直到元素出现

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # 等待10秒
driver.get('https://www.example.com')
element = driver.find_element(By.ID, 'some_id')

2. 显式等待
用法: 显式等待用于等待某个特定的条件发生,比如等待某个元素可见或某个元素可点击

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get('https://www.example.com')

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'some_id'))
)

这里element = WebDriverWait(driver, 10).until()中,until()是条件,可以不写,不写就是等待页面所有的元素都加载完毕再执行下一步,加上条件就是只要条件里的元素加载出来了就可以进行下一步了,其中WebDriverWait(driver, 10)里可以写一个检查时间,比如WebDriverWait(driver, 10,0.5)这样就是每过0.5秒就检查一下元素加载完成没有

3. 固定等待
用法: 在代码中设置一个固定的睡眠时间,暂停代码的执行

import time

time.sleep(5)  # 等待5秒

4. 异步等待
用法: 在使用异步编程时,可以通过 await 关键字来实现异步等待

import asyncio

async def main():
    await asyncio.sleep(5)  # 异步等待5秒

5. 条件等待
用法: 条件等待允许设置一个最大等待时间,并且可以设置等待时的轮询间隔,还可以忽略特定的异常

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException

wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[NoSuchElementException])
element = wait.until(EC.presence_of_element_located((By.ID, 'some_id')))

我们最常用的是显示等待,固定等待用的也多,但是不太推荐,因为页面的加载速度不一样,不同环境下的可能会出问题,所以推荐用显示等待,等这个元素或者整个页面加载完了再去执行,更靠谱更稳定,相比条件等待还更简单

各种延迟的优点总结一下:

隐式等待: 全局设置,对所有元素查找生效。
显式等待: 针对特定条件的精确等待,更适合动态内容的加载。
固定等待: 简单但效率低,适合初学者或测试简单的场景。
异步等待: 用于异步环境,允许其他任务并行执行。
条件等待: 提供更多的自定义选项,适合复杂场景。

三、无头浏览器

其实无头浏览器这种不是经常用的,因为看不到具体执行过程,无法判断某些东西是否正常

无头浏览器其实就是将来在执行自动化脚本时,不打开页面,在后台执行

这是我写的一段示例:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# 创建 ChromeOptions 对象
chrome_options = Options()
chrome_options.add_argument("--headless")  # 设置为无头模式

# 创建 ChromeDriver 对象
driver = webdriver.Chrome(options=chrome_options)

# 打开网页
driver.get("https://www.example.com")

# 执行你的操作
print(driver.title)

# 关闭浏览器
driver.quit()

这整个过程是看不到的,都在后台运行,优点也很明显,没有了显示他的速度会更快,尤其是在处理某些复杂的 JavaScript 动态内容

四、弹窗操作

我们日常浏览各种网页的时候会遇到JS弹窗,在做自动化的时候他们也是我们要操作的、

比如这种弹窗

在Selenium中对这些弹窗操作也是很简单的

from selenium import webdriver
from selenium.webdriver.common.alert import Alert

# 打开浏览器
driver = webdriver.Chrome()

# 访问触发弹窗的页面
driver.get("https://example.com")

# 切换到弹窗
alert = Alert(driver)

# 接受弹窗(点击“确定”按钮)
alert.accept()

# 或者,取消弹窗(点击“取消”按钮)
alert.dismiss()

# 如果是 prompt 类型的弹窗,还可以输入文本
alert.send_keys("Some text")
alert.accept()

五、窗口切换

测试中我们会遇到某个功能会打开一个新的页面,这个时候我们就需要切换来操作新的页面,不然之前页面的代码是无法操作新页面的

这里写了一个例子

# 获取当前窗口句柄
main_window = driver.current_window_handle

# 假设操作打开了一个新窗口
new_window = driver.window_handles[-1]

# 切换到新窗口
driver.switch_to.window(new_window)

# 在新窗口中执行操作...

# 完成后切换回主窗口
driver.switch_to.window(main_window)

六、下拉框

下拉框是一个 <select> 元素,可以使用 Selenium 的 Select 类来选择下拉框中的选项,直接选择是无法选择到下拉框内容的


1. 选择下拉框选项
 

from selenium.webdriver.support.ui import Select

# 找到下拉框元素
dropdown = Select(driver.find_element_by_id("dropdown_id"))

# 通过可见文本选择
dropdown.select_by_visible_text("Option Text")

# 通过索引选择
dropdown.select_by_index(1)

# 通过值选择
dropdown.select_by_value("option_value")

2. 获取所有选项

# 获取所有选项
options = dropdown.options
for option in options:
    print(option.text)

3. 取消选择

如果下拉框是多选的,可以通过以下方式取消选择

dropdown.deselect_all()

第二天的内容就到此结束啦~

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Betray391

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值