Skip to content

Commit

Permalink
[py] add script pinning to python bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
AutomatedTester committed Oct 7, 2020
1 parent 6e59a16 commit 7f82408
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 0 deletions.
30 changes: 30 additions & 0 deletions py/selenium/webdriver/remote/script_key.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The SFC licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License
import uuid


class ScriptKey:

def __init__(self):
self._id = uuid.uuid4()

@property
def id(self):
return self._id

def __eq__(self, other):
return self._id == other
29 changes: 29 additions & 0 deletions py/selenium/webdriver/remote/webdriver.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@
from .file_detector import FileDetector, LocalFileDetector
from .mobile import Mobile
from .remote_connection import RemoteConnection
from .script_key import ScriptKey
from .switch_to import SwitchTo
from .webelement import WebElement

from selenium.common.exceptions import (InvalidArgumentException,
JavascriptException,
WebDriverException,
NoSuchCookieException,
UnknownMethodException)
Expand Down Expand Up @@ -190,6 +192,7 @@ def __init__(self, command_executor='http://127.0.0.1:4444',
self._is_remote = True
self.session_id = None
self.caps = {}
self.pinned_scripts = {}
self.error_handler = ErrorHandler()
self.start_client()
self.start_session(capabilities, browser_profile)
Expand Down Expand Up @@ -703,6 +706,26 @@ def find_elements_by_css_selector(self, css_selector):
warnings.warn("find_elements_by_* commands are deprecated. Please use find_elements() instead")
return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)

def pin_script(self, script):
"""
"""
script_key = ScriptKey()
self.pinned_scripts[script_key.id] = script
return script_key

def unpin(self, script_key):
"""
"""
self.pinned_scripts.pop(script_key.id)

def get_pinned_scripts(self):
"""
"""
return list(self.pinned_scripts.keys())

def execute_script(self, script, *args):
"""
Synchronously Executes JavaScript in the current window/frame.
Expand All @@ -716,6 +739,12 @@ def execute_script(self, script, *args):
driver.execute_script('return document.title;')
"""
if isinstance(script, ScriptKey):
try:
script = self.pinned_scripts[script.id]
except KeyError:
raise JavascriptException("Pinned script could not be found")

converted_args = list(args)
command = None
if self.w3c:
Expand Down
69 changes: 69 additions & 0 deletions py/test/selenium/webdriver/common/script_pinning_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The SFC licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

import pytest

from selenium.common.exceptions import JavascriptException


def test_should_allow_script_pinning(driver, pages):
pages.load("simpleTest.html")
driver.pinned_scripts = {}
script_key = driver.pin_script("return 'i like cheese';")

result = driver.execute_script(script_key)

assert result == 'i like cheese'


def test_should_allow_pinned_scripts_to_take_arguments(driver, pages):
pages.load("simpleTest.html")
driver.pinned_scripts = {}
hello = driver.pin_script("return arguments[0]")

result = driver.execute_script(hello, "cheese")

assert result == "cheese"


def test_should_list_all_pinned_scripts(driver, pages):
pages.load("simpleTest.html")
driver.pinned_scripts = {}
expected = []
expected.append(driver.pin_script("return arguments[0];").id)
expected.append(driver.pin_script("return 'cheese';").id)
expected.append(driver.pin_script("return 42;").id)

result = driver.get_pinned_scripts()
assert expected == result


def test_should_allow_scripts_to_be_unpinned(driver, pages):
pages.load("simpleTest.html")
driver.pinned_scripts = {}
cheese = driver.pin_script("return 'cheese';")
driver.unpin(cheese)
results = driver.get_pinned_scripts()
assert cheese not in results


def test_calling_unpinned_script_causes_error(driver, pages):
pages.load("simpleTest.html")
cheese = driver.pin_script("return 'brie';")
driver.unpin(cheese)
with pytest.raises(JavascriptException):
driver.execute_script(cheese)

0 comments on commit 7f82408

Please sign in to comment.