selenium-web控件交互进阶Actions

一.Actions

ActionChains:执行PC端鼠标的点击,双击,右键,拖拽等事件

TouchActions:模拟PC端和移动端(h5页面)的点击,滑动,拖拽,多点触控等多种手势

二.动作链接ActionChains

参考:7.2 行为链 - selenium-python中文文档 (python-selenium-zh.readthedocs.io)

1.原理:

调用ActionChains的方法时,不会立即执行,而是将所有的操作,按顺序放在一个队列中,当你调用perform()方法时,队列中事件会依次执行

2.基本用法:

  • 生成一个动作action = ActionChains(driver)
  • 动作添加方法1:action.方法1

调用perform()方法执行action.perform()

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



class TestAction:
    def setup(self):
        self.driver = webdriver.Chrome()
        # 隐式等待
        self.driver.implicitly_wait(5)
        self.driver.get("https://www.baidu.com/")
        self.driver.maximize_window()


    def teardown(self):
        self.driver.quit()

    def test_baidu(self):
        self.driver.find_element(By.ID, "kw").send_keys("格沃兹测试学院")
        self.driver.find_element(By.ID, "su").click()
        el = self.driver.find_element_by_link_text("设置")
        action = ActionChains(self.driver)
        action.move_to_element(el)
        action.perform()
        sleep(3)
3.ActionChains方法列表
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素 eg:action.send_keys(Key.SPACE) 输入空格,基本上键盘上的操作都可以模拟
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

三、TouchActions

参考:Selenium API PY 文档 - selenium.webdriver.common.touch_actions (liushilive.github.io)

主要方法有:

  • double_tap(on_element)   双击
  • flick_element(on_element, xoffset, yoffset, speed)   从元素开始以指定的速度移动
  • long_press(on_element)   长按不释放
  • move(xcoord, ycoord)   移动到指定的位置
  • perform()   执行链中的所有动作
  • release(xcoord, ycoord)   在某个位置松开操作
  • scroll(xoffset, yoffset) #滚动到某个位置
  • scroll_from_element(on_element, xoffset, yoffset)   从某元素开始滚动到某个位置
  • tap(on_element)      单击
  • tap_and_hold(xcoord, ycoord)     某点按
    from selenium import webdriver
    from selenium.webdriver import ActionChains, TouchActions
    from selenium.webdriver.common.by import By
    from time import sleep
    
    
    class TestCeshiren:
        def setup(self):
            opt = webdriver.ChromeOptions()
            opt.add_experimental_option('w3c', False)
            self.driver = webdriver.Chrome(chrome_options=opt)
            # 隐式等待
            self.driver.implicitly_wait(5)
            self.driver.get("https://www.baidu.com")
            self.driver.maximize_window()
    
    
        def teardown(self):
            self.driver.quit()
    
        def test_TouchActions(self):
            el = self.driver.find_element(By.ID, "kw")
            el_search = self.driver.find_element(By.ID, "su")
            el.send_keys("selenium测试")
            action = TouchActions(self.driver)
            action.tap(el_search)
            action.perform()
            action.scroll_from_element(el, 0, 10000).perform()
            sleep(3)

备注:执行报错:

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x000002537D0AF7F0>
response = {‘status’: 404, ‘value’: ‘{“value”:{“error”:“unknown command”,“message”:“unknown command: Cannot call non W3C standard…jectPath [0x778387A4+228]\n\tRtlGetAppContainerNamedObjectPath [0x77838774+180]\n\t(No symbol) [0x00000000]\n”}}’}

解决:

设置下这个参数

opt = webdriver.ChromeOptions()
opt.add_experimental_option('w3c',  False)
driver = webdriver.Chrome(chrome_options=opt)

因为当前响应不是标准的W3C规范,所以无法处理,关闭W3C验证就可以了

<think>嗯,用户想了解Selenium的学习进阶,首先我需要考虑他们的当前水平。可能他们已经掌握了Selenium的基础,比如元素定位、基本操作等,现在想深入提升。那进阶的内容应该包括哪些呢?框架设计、高级API、并行测试、集成CI/CD这些可能是重点。 框架设计方面,用户可能需要了解如何组织测试用例,比如PO模式,这样代码更易维护。还有数据驱动测试,用外部数据源来参数化测试,提高复用性。测试报告生成也很重要,比如用Allure生成美观的报告,帮助团队分析结果。 然后是高级API,比如处理弹窗、iframe、文件上传下载,这些在实际项目中常见。还有执行JavaScript脚本,处理复杂交互。等待机制也很关键,隐式和显式等待的区别和应用场景需要解释清楚。 并行测试和分布式执行可以提升效率,用Selenium Grid或者Docker容器化技术来实现。集成CI/CD的话,Jenkins、GitHub Actions这些工具如何与Selenium结合,自动化测试流程。 此外,性能优化和异常处理也是进阶内容。比如减少不必要的等待时间,处理网络延迟,元素定位失败时的重试机制。还有移动端测试,Appium与Selenium的结合,可能用户也会感兴趣。 最后,推荐一些学习资源,比如官方文档、在线课程,以及开源项目,帮助用户实践。可能需要提醒他们多动手做项目,参与社区,持续学习新技术。要确保内容结构清晰,步骤明确,让用户能一步步提升技能。</think>好的!关于 **Selenium 学习进阶**,以下是系统化的学习路径和建议,帮助你从基础到高级逐步掌握自动化测试技能: --- ### **一、基础巩固(必备知识)** 1. **核心组件** - **WebDriver**:掌握不同浏览器(Chrome、Firefox、Edge)的驱动配置。 - **元素定位**:熟练使用 XPath、CSS Selector、ID 等定位策略。 - **常用操作**:点击、输入、表单提交、页面跳转、窗口切换等。 2. **等待机制** - **隐式等待**:`implicitly_wait` 全局等待。 - **显式等待**:`WebDriverWait` + `expected_conditions` 精确控制条件等待。 3. **数据驱动测试** - 使用 `unittest` 或 `pytest` 管理测试用例。 - 参数化测试数据(如 CSV、Excel、JSON)。 --- ### **二、进阶技能(提升效率与稳定性)** 1. **Page Object Model (PO 设计模式)** - 将页面元素和操作封装为类,提高代码复用性。 - 示例: ```python class LoginPage: def __init__(self, driver): self.driver = driver self.username = (By.ID, "username") self.password = (By.ID, "password") def login(self, username, password): self.driver.find_element(*self.username).send_keys(username) self.driver.find_element(*self.password).send_keys(password) ``` 2. **高级交互** - **鼠标/键盘操作**:使用 `ActionChains` 实现拖拽、悬停、组合键。 - **文件上传/下载**:处理浏览器弹窗和非 HTML 控件- **Cookie 管理**:读取、添加、删除浏览器 Cookie。 3. **框架集成** - **测试报告**:集成 `Allure` 或 `HTMLTestRunner` 生成可视化报告。 - **日志记录**:使用 `logging` 模块跟踪测试过程。 - **异常处理**:捕获截图、记录错误信息。 --- ### **三、高阶应用(企业级解决方案)** 1. **分布式测试** - **Selenium Grid**:跨浏览器、跨设备并行执行测试。 - **Docker 化**:通过容器技术快速部署测试环境。 2. **持续集成(CI/CD)** - 集成 Jenkins、GitHub Actions 或 GitLab CI。 - 实现自动化触发测试任务。 3. **性能优化** - 减少不必要的等待时间。 - 使用 Headless 模式(无界面运行)提升速度。 4. **移动端测试** - 结合 **Appium** 实现 Android/iOS 应用自动化。 - 使用 `desired_capabilities` 配置设备参数。 --- ### **四、专项突破(实际场景问题)** 1. **复杂场景处理** - **iframe 切换**:`driver.switch_to.frame()` - **弹窗处理**:Alert、JavaScript 弹窗。 - **动态元素**:XPath 动态表达式(如 `contains()`、`starts-with()`)。 2. **反爬虫绕过** - 修改浏览器指纹(User-Agent、WebGL 参数)。 - 使用代理 IP 池避免封禁。 3. **JavaScript 执行** - 通过 `driver.execute_script()` 调用 JS 代码。 - 示例:滚动页面、修改元素属性。 --- ### **五、学习资源推荐** 1. **官方文档**:[Selenium 官网](https://www.selenium.dev/documentation/) 2. **书籍**: -Selenium 自动化测试指南》 - 《Mastering Selenium WebDriver 3.0》 3. **实战项目**: - 电商网站自动化下单流程。 - 社交媒体自动登录与内容抓取。 4. **社区**: - Stack Overflow:解决具体问题。 - GitHub:学习开源项目(如 SeleniumBase、WebDriverManager)。 --- ### **六、关键注意事项** 1. **维护性**:代码需模块化,避免冗余。 2. **稳定性**:增加失败重试机制。 3. **版本兼容**:注意 Selenium、浏览器驱动、浏览器的版本匹配。 通过以上路径,你可以逐步从基础功能测试进阶到复杂的企业级自动化解决方案。**实践是核心**,建议通过实际项目加深理解!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值