Web控件进阶交互

Web控件进阶交互

         测试时常需要模拟键盘或鼠标操作,可以用Python的ActionChains来模拟。ActionChains是Selenium提供的一个子类,用于生成和执行复杂的用户交互操作,允许将一系列操作链接在一起,然后一次性执行。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 初始化WebDriver和ActionChains
driver = webdriver.Chrome()
actions = ActionChains(driver)

# 打开一个网页
driver.get("https://www.example.com")
  • 移动到元素并点击
element = driver.find_element(By.ID, "example_id")
actions.move_to_element(element).click().perform()
  • 右键点击
actions.context_click(element).perform()
  • 双击
actions.double_click(element).perform()
  • 拖放
source = driver.find_element(By.ID, "source_id")
target = driver.find_element(By.ID, "target_id")
actions.drag_and_drop(source, target).perform()
  • 拖放到指定位置
actions.click_and_hold(source).move_to_element(target).release().perform()
  •  键盘输入
actions.send_keys("Hello World!").perform()
  • 组合键操作
actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()

 网页frame于多窗口处理

        测试时要定位Web内的一个元素时,若定位不到这个元素,就需要考虑是不是浏览器内嵌了一个frame窗口,或者要找的元素在新打开的窗口。为了解决这个问题就需要进行frame切换或者窗口切换操作。

        frame类似于在原有主HTML的基础上又嵌套了一个HTML,嵌套的HTML是独立的,不影响主HTML。执行Web测试打开一个页面时,光标的定位是在主页面中,如果主页面是由多个frame组成的,那么光标无法直接定位到具体的元素,需要切换到对应的frame中。

iframe解析

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

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

通过iframe索引切换

可以通过iframe在页面中的索引来切换。索引从0开始

driver.switch_to.frame(0)

通过 iframe的名称或ID切换

如果iframe有name或id属性,可以通过这些属性来切换

driver.switch_to.frame("iframe_name")

通过iframe的WebElement切换

先找到iframe元素,然后通过该元素切换

iframe_element = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe_element)

嵌套iframe的切换

如果iframe内部还有iframe,需要先切换到外层iframe,然后再切换到内层的iframe

outer_iframe = driver.find_element(By.ID, "outer_iframe_id")
driver.switch_to.frame(outer_iframe)
inner_iframe = driver.find_element(By.ID, "inner_iframe_id")
driver.switch_to.frame(inner_iframe)

# 切换到外层iframe
driver.switch_to.parent_frame()

 切换回主文档

无论当前再哪个iframe中,都可以直接切换到主文档

driver.switch_to.default_content()

多窗口处理 

        元素有属性,浏览器的窗口也有属性,浏览器窗口的属性用句柄(handle)来识别。当用浏览器打开一个窗口时,就需要用句柄来操作这个窗口。

获取句柄
# 获取当前窗口的句柄
cnt_handle = driver.current_window_handle
# 获取所有窗口的句柄
all_handles = driver.window_handles
 句柄切换
driver.switch_to.window(target_handle)

Selenium对多浏览器处理

        自动化测试过程中,往往需要对不同的浏览器做兼容性测试,可以通过对测试用例的修改实现对不同浏览器的自动化兼容性测试。实现对不同浏览器的自动化兼容性测试,需要先将各个浏览器的驱动在PC端配置好。

 参数化多浏览器测试

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

def test_with_browser(browser_name):
    if browser_name == "chrome":
        driver = webdriver.Chrome()
    elif browser_name == "firefox":
        driver = webdriver.Firefox()
    elif browser_name == "edge":
        driver = webdriver.Edge()
    elif browser_name == "safari":
        driver = webdriver.Safari()
    else:
        raise ValueError(f"Unsupported browser: {browser_name}")

    driver.get("https://www.baidu.com")
    print(f"{browser_name.capitalize()} - Title: {driver.title}")
    driver.quit()

if __name__ == "__main__":
    for browser in ["chrome", "firefox", "edge", "safari"]:
        test_with_browser(browser)

相关推荐

  1. Web交互

    2024-07-13 05:54:02       29 阅读
  2. C#-ASP.NET常用总结

    2024-07-13 05:54:02       30 阅读
  3. 实现交互---智能窗帘系统

    2024-07-13 05:54:02       37 阅读
  4. 交互与视图交互的区别

    2024-07-13 05:54:02       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 05:54:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 05:54:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 05:54:02       58 阅读
  4. Python语言-面向对象

    2024-07-13 05:54:02       69 阅读

热门阅读

  1. iOS开发-Xcode

    2024-07-13 05:54:02       21 阅读
  2. Xcode依赖管理大师:精通项目依赖的艺术与实践

    2024-07-13 05:54:02       21 阅读
  3. 数据结构笔记之特殊矩阵压缩

    2024-07-13 05:54:02       26 阅读
  4. 交换机的二三层原理

    2024-07-13 05:54:02       24 阅读
  5. pdf工具

    pdf工具

    2024-07-13 05:54:02      24 阅读
  6. Xcode项目文件与资源管理:精通技巧与实践指南

    2024-07-13 05:54:02       25 阅读
  7. ChatGPT对话:如何制作静态网页?

    2024-07-13 05:54:02       24 阅读
  8. QLabel控件

    2024-07-13 05:54:02       23 阅读
  9. deepstream读取mp4文件及不同类型视频输入bug解决

    2024-07-13 05:54:02       27 阅读
  10. samout 结构再优化 收敛速度再加快

    2024-07-13 05:54:02       24 阅读
  11. 延时订单的实现

    2024-07-13 05:54:02       28 阅读
  12. 数学基础 -- 三角学

    2024-07-13 05:54:02       27 阅读
  13. 07-7.5.2 散列函数的构造

    2024-07-13 05:54:02       27 阅读
  14. React vs Vue:谁是前端界的冠军?

    2024-07-13 05:54:02       24 阅读
  15. [NeetCode 150] Longest Consecutive Sequence

    2024-07-13 05:54:02       21 阅读
  16. sqlserver设置端口

    2024-07-13 05:54:02       22 阅读
  17. C++:using重新定义继承时访问权限

    2024-07-13 05:54:02       29 阅读
  18. git列出提交记录的文件路径

    2024-07-13 05:54:02       23 阅读
  19. 关于对于短视频的认识-复盘与再次复盘

    2024-07-13 05:54:02       23 阅读
  20. sqlalchemy反射视图

    2024-07-13 05:54:02       21 阅读
  21. vue 组件里面的方法修改外面的数据

    2024-07-13 05:54:02       25 阅读
  22. 使用Trie树高亮关键词

    2024-07-13 05:54:02       25 阅读