Skip to content

Add python example to Selenium webdriver support listener #2202

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: trunk
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 156 additions & 0 deletions examples/python/tests/support/test_listener.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,158 @@
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListener


class MyListener(AbstractEventListener):
def __init__(self):
self.events = []

def before_navigate_to(self, url: str, driver) -> None:
print(f"before_navigate_to: {url}")
self.events.append(f"before_navigate_to")

def after_navigate_to(self, url: str, driver) -> None:
print(f"after_navigate_to: {url}")
self.events.append(f"after_navigate_to")

def before_navigate_back(self, driver) -> None:
print("before_navigate_back")
self.events.append("before_navigate_back")

def after_navigate_back(self, driver) -> None:
print("after_navigate_back")
self.events.append("after_navigate_back")

def before_navigate_forward(self, driver) -> None:
print("before_navigate_forward")
self.events.append("before_navigate_forward")

def after_navigate_forward(self, driver) -> None:
print("after_navigate_forward")
self.events.append("after_navigate_forward")

def before_close(self, driver) -> None:
print("before_close")
self.events.append("before_close")

def after_close(self, driver) -> None:
print("after_close")
self.events.append("after_close")

def before_quit(self, driver) -> None:
print("before_quit")
self.events.append("before_quit")

def after_quit(self, driver) -> None:
print("after_quit")
self.events.append("after_quit")

def before_find(self, by, value, driver) -> None:
print("before_find")
self.events.append("before_find")

def after_find(self, by, value, driver) -> None:
print("after_find")
self.events.append("after_find")

def before_click(self, element, driver) -> None:
print("before_click")
self.events.append("before_click")

def after_click(self, element, driver) -> None:
print("after_click")
self.events.append("after_click")

def before_change_value_of(self, element, driver) -> None:
print("before_change_value")
self.events.append("before_change_value")

def after_change_value_of(self, element, driver) -> None:
print("after_change_value")
self.events.append("after_change_value")

def before_execute_script(self, script, driver) -> None:
print("before_execute_script")
self.events.append("before_execute_script")

def after_execute_script(self, script, driver) -> None:
print("after_execute_script")
self.events.append("after_execute_script")

def on_exception(self, exception, driver) -> None:
print("on_exception")
self.events.append("on_exception")

def test_navigate_and_quit():
driver = webdriver.Chrome()
listener = MyListener()
event_driver = EventFiringWebDriver(driver, listener)
event_driver.get("https://www.selenium.dev/selenium/web/")
event_driver.get("https://www.selenium.dev/selenium/web/clicks.html")
event_driver.back()
event_driver.forward()
event_driver.quit()
print(listener.events)

assert "before_navigate_to" in listener.events
assert "after_navigate_to" in listener.events
assert "before_navigate_back" in listener.events
assert "after_navigate_back" in listener.events
assert "before_navigate_forward" in listener.events
assert "after_navigate_forward" in listener.events
assert "before_quit" in listener.events
assert "after_quit" in listener.events

def test_find_and_click_and_close():
driver = webdriver.Chrome()
listener = MyListener()
event_driver = EventFiringWebDriver(driver, listener)
event_driver.get("https://www.selenium.dev/selenium/web/clicks.html")
element = event_driver.find_element(By.ID, "new-window")

assert 'before_find' in listener.events
assert 'after_find' in listener.events

element.click()

assert 'before_click' in listener.events
assert 'after_click' in listener.events

event_driver.switch_to.window(event_driver.window_handles[-1])
event_driver.close()

assert 'before_close' in listener.events

event_driver.switch_to.window(event_driver.window_handles[0])
print(listener.events)

def test_change_value():
driver = webdriver.Chrome()
listener = MyListener()
event_driver = EventFiringWebDriver(driver, listener)
event_driver.get("https://www.selenium.dev/selenium/web/inputs.html")
element = event_driver.find_element(By.NAME, "no_type")
print(listener.events)
element.clear()

assert 'before_change_value' in listener.events
assert 'after_change_value' in listener.events

def test_execute_script_and_exception():
driver = webdriver.Chrome()
listener = MyListener()
event_driver = EventFiringWebDriver(driver, listener)
urls = ["https://www.selenium.dev/selenium/web/",
"https://www.selenium.dev/selenium/web/inputs.html"]
for url in urls:
event_driver.get(url)
try:
element = event_driver.find_element(By.NAME, "no_type")
print(listener.events)
event_driver.execute_script("arguments[0].value = 'test'", element)
except Exception as e:
print(f"Exception: {e}")
continue

assert 'before_execute_script' in listener.events
assert 'after_execute_script' in listener.events
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,45 @@ aliases: [
]
---

These allow you to execute custom actions in every time specific Selenium commands are sent
These allow you to execute custom actions in every time specific Selenium commands are sent.


## Define

A custom Listener needs to inherit from AbstractEventListener in Selenium and override the methods in AbstractEventListener.
Here’s a simple example to print and log events:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L1-L33" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Ruby" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="JavaScript" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Kotlin" >}}
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

## Usage

Create an event listener driver through EventFiringWebDriver:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L87-L96" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
Expand All @@ -29,3 +60,4 @@ These allow you to execute custom actions in every time specific Selenium comman
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

Original file line number Diff line number Diff line change
@@ -1,20 +1,51 @@
---
title: "Command Listeners"
linkTitle: "Listeners"
title: "コマンドリスナー"
linkTitle: "リスナー"
weight: 2
aliases: [
"/ja/documentation/webdriver/drivers/listeners",
"/documentation/webdriver/drivers/listeners",
]
---

These allow you to execute custom actions in every time specific Selenium commands are sent
これにより、特定のSeleniumコマンドが送信されるたびにカスタムアクションを実行することができます。


## 定義

カスタムリスナーは、SeleniumのAbstractEventListenerを継承し、AbstractEventListenerのメソッドをオーバーライドする必要があります。
イベントを印刷してログに記録するための簡単な例を示します:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L1-L33" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Ruby" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="JavaScript" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Kotlin" >}}
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

## 使用(しよう)

EventFiringWebDriverを使ってイベントリスナードライバーを作成する:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L87-L96" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
Expand All @@ -29,3 +60,4 @@ These allow you to execute custom actions in every time specific Selenium comman
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

Original file line number Diff line number Diff line change
@@ -1,20 +1,51 @@
---
title: "Command Listeners"
linkTitle: "Listeners"
title: "Ouvintes de Comando"
linkTitle: "Ouvintes"
weight: 2
aliases: [
"/pt-br/documentation/webdriver/drivers/listeners",
"/documentation/webdriver/drivers/listeners",
]
---

These allow you to execute custom actions in every time specific Selenium commands are sent
isso permite que você execute ações personalizadas sempre que comandos específicos do Selenium são enviados.


## Definir

Um Listener personalizado precisa herdar de AbstractEventListener no Selenium e sobrescrever os métodos em AbstractEventListener.
Aqui está um exemplo simples para imprimir e registrar eventos:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L1-L33" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Ruby" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="JavaScript" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Kotlin" >}}
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

## Uso

Crie um driver de ouvinte de eventos através do EventFiringWebDriver:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L87-L96" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
Expand All @@ -29,3 +60,4 @@ These allow you to execute custom actions in every time specific Selenium comman
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,42 @@ aliases: [

允许您在每次发送特定 Selenium 命令时执行自定义操作

## 定义

自定义的Listener需要继承selenium中的AbstractEventListener同时重写AbstractEventListener中的方法.
有一个简单打印和记录事件的例子:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L1-L33" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Ruby" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="JavaScript" >}}
{{< badge-code >}}
{{< /tab >}}
{{< tab header="Kotlin" >}}
{{< badge-code >}}
{{< /tab >}}
{{< /tabpane >}}

## 使用

通过EventFiringWebDriver创建监听事件driver:

{{< tabpane text=true >}}
{{< tab header="Java" >}}
{{< badge-code >}}
{{< /tab >}}
{{% tab header="Python" %}}
{{< gh-codeblock path="examples/python/tests/support/test_listener.py#L87-L96" >}}
{{% /tab %}}
{{< tab header="CSharp" >}}
{{< badge-code >}}
Expand Down