当前位置: 首页 > news >正文

Selenium 实现事件监听

介绍

前面的文章详细介绍了Selenium4.0的使用方法,我们打开Selenium的包发现里面有两个比较实用的工具。abstract_event_listener.py(抽象事件监听器)、event_firing_webdriver(webdriver事件触发器),看一下代码发现,这两个工具可以实现Selenium事件监听,监听点击、输入、跳转等操作。

抽象事件监听器

通过查看代码发现,抽象事件监听器是一些操作的抽象监听方法,我们可以写一些监听方法来实现这些监听器。但是,通过和Java包的对比发现python包的监听器功能比Java要少好多。有兴趣的同学可以看一下Java包的代码。

class AbstractEventListener:"""Event listener must subclass and implement this fully or partially."""def before_navigate_to(self, url: str, driver) -> None:passdef after_navigate_to(self, url: str, driver) -> None:passdef before_navigate_back(self, driver) -> None:passdef after_navigate_back(self, driver) -> None:passdef before_navigate_forward(self, driver) -> None:passdef after_navigate_forward(self, driver) -> None:passdef before_find(self, by, value, driver) -> None:passdef after_find(self, by, value, driver) -> None:passdef before_click(self, element, driver) -> None:passdef after_click(self, element, driver) -> None:passdef before_change_value_of(self, element, driver) -> None:passdef after_change_value_of(self, element, driver) -> None:passdef before_execute_script(self, script, driver) -> None:passdef after_execute_script(self, script, driver) -> None:passdef before_close(self, driver) -> None:passdef after_close(self, driver) -> None:passdef before_quit(self, driver) -> None:passdef after_quit(self, driver) -> None:passdef on_exception(self, exception, driver) -> None:pass

webdriver事件触发器

从触发器的代码可以看出来,触发器需要传递两个参数,一个是WebDriver类型的参数,一个抽象事件监听器类型。

class EventFiringWebDriver:"""A wrapper around an arbitrary WebDriver instance which supports firingevents."""def __init__(self, driver: WebDriver, event_listener: AbstractEventListener) -> None:"""Creates a new instance of the EventFiringWebDriver.:Args:- driver : A WebDriver instance- event_listener : Instance of a class that subclasses AbstractEventListener and implements it fully or partiallyExample:::from selenium.webdriver import Firefoxfrom selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListenerclass MyListener(AbstractEventListener):def before_navigate_to(self, url, driver):print("Before navigate to %s" % url)def after_navigate_to(self, url, driver):print("After navigate to %s" % url)driver = Firefox()ef_driver = EventFiringWebDriver(driver, MyListener())ef_driver.get("http://www.google.co.in/")"""if not isinstance(driver, WebDriver):raise WebDriverException("A WebDriver instance must be supplied")if not isinstance(event_listener, AbstractEventListener):raise WebDriverException("Event listener must be a subclass of AbstractEventListener")self._driver = driverself._driver._wrap_value = self._wrap_valueself._listener = event_listener

实现抽象事件监听器

监听点击事件

from selenium.webdriver.support.abstract_event_listener import AbstractEventListenerclass PageListener(AbstractEventListener):def before_click(self, element, driver) -> None:print("监听点击事件执行前")def after_click(self, element, driver) -> None:print("监听点击事件执行后")

编写Selenium脚本,执行点击操作。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
from page_listener import PageListenerdriver = webdriver.Chrome()
listener = PageListener()
ef_driver = EventFiringWebDriver(driver, listener)
ef_driver.get('http://www.baidu.com')
ef_driver.find_element(by=By.XPATH, value='//*[@id="su"]').click()"""
监听点击事件执行前
监听点击事件执行后Process finished with exit code 0
"""

监听输入事件

from selenium.webdriver.support.abstract_event_listener import AbstractEventListenerclass PageListener(AbstractEventListener):def before_quit(self, driver) -> None:print("监听退出事件前")def after_quit(self, driver) -> None:print("监听退出事件后")

编写Selenium执行退出操作的脚本。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
from page_listener import PageListenerdriver = webdriver.Chrome()
listener = PageListener()
ef_driver = EventFiringWebDriver(driver, listener)
ef_driver.get('http://www.baidu.com')
ef_driver.find_element(by=By.XPATH, value='//*[@id="kw"]').send_keys('百度')
ef_driver.quit()"""
监听退出事件前
监听退出事件后Process finished with exit code 0
"""

总结#

从上面的实例可以看出来,我们已经实现了部分事件监听器,那么都有哪些监听方法呢,我们用的是Selenium目前最新的版本4.24。python版本的Selenium,只支持19个监听方法。对比Java支持的监听方法比较少,Java的Selenium4.24版本的监听方法有143个。下面是Python版Selenium支持的监听方法。

class AbstractEventListener:"""Event listener must subclass and implement this fully or partially."""def before_navigate_to(self, url: str, driver) -> None:passdef after_navigate_to(self, url: str, driver) -> None:passdef before_navigate_back(self, driver) -> None:passdef after_navigate_back(self, driver) -> None:passdef before_navigate_forward(self, driver) -> None:passdef after_navigate_forward(self, driver) -> None:passdef before_find(self, by, value, driver) -> None:passdef after_find(self, by, value, driver) -> None:passdef before_click(self, element, driver) -> None:passdef after_click(self, element, driver) -> None:passdef before_change_value_of(self, element, driver) -> None:passdef after_change_value_of(self, element, driver) -> None:passdef before_execute_script(self, script, driver) -> None:passdef after_execute_script(self, script, driver) -> None:passdef before_close(self, driver) -> None:passdef after_close(self, driver) -> None:passdef before_quit(self, driver) -> None:passdef after_quit(self, driver) -> None:passdef on_exception(self, exception, driver) -> None:pass

http://www.mrgr.cn/news/21318.html

相关文章:

  • 《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂》可以在苹果Mac电脑上玩吗?
  • C++入门10——stack与queue的使用
  • 浏览器插件快速开启/关闭IDM接管下载
  • 久久派安装启用USB摄像头(基于node-red)
  • 精通推荐算法29:行为序列建模之MIMN— 记忆网络建模长周期行为序列
  • 【C++ 面试 - 新特性】每日 3 题(五)
  • Tensorflow2如何读取自制数据集并训练模型?-- Tensorflow自学笔记13
  • 第4章-02-用WebDriver驱动浏览器页面截图
  • GIS圈大事件!Cesium被收购了,是好是坏?
  • 智能制造中,叉车防撞报警系统的数字化管理
  • vivado 时钟交互报告
  • python画图|3D图基础教程
  • matplotlib中文乱码问题
  • SpringBoot 集成 PDFBox 实现电子签章
  • SQL的高级查询练习知识点下(day26)
  • 企业邮箱怎么设置邮箱监控(老板监控员工邮件的方法推荐)【企业管理必备】
  • 基于web宾馆管理系统设计与实现
  • C++学习, 类的构造函数
  • 【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题
  • C++11 异常