Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/py/test/selenium/webdriver/common/executing_javascript_tests.py
1865 views
1
# Licensed to the Software Freedom Conservancy (SFC) under one
2
# or more contributor license agreements. See the NOTICE file
3
# distributed with this work for additional information
4
# regarding copyright ownership. The SFC licenses this file
5
# to you under the Apache License, Version 2.0 (the
6
# "License"); you may not use this file except in compliance
7
# with the License. You may obtain a copy of the License at
8
#
9
# http://www.apache.org/licenses/LICENSE-2.0
10
#
11
# Unless required by applicable law or agreed to in writing,
12
# software distributed under the License is distributed on an
13
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
# KIND, either express or implied. See the License for the
15
# specific language governing permissions and limitations
16
# under the License.
17
18
import pytest
19
20
from selenium.common.exceptions import WebDriverException
21
from selenium.webdriver.common.by import By
22
from selenium.webdriver.remote.webelement import WebElement
23
24
try:
25
str = unicode
26
except NameError:
27
pass
28
29
30
def test_should_be_able_to_execute_simple_javascript_and_return_astring(driver, pages):
31
pages.load("xhtmlTest.html")
32
33
result = driver.execute_script("return document.title")
34
35
assert isinstance(result, str), "The type of the result is %s" % type(result)
36
assert "XHTML Test Page" == result
37
38
39
def test_should_be_able_to_execute_simple_javascript_and_return_an_integer(driver, pages):
40
pages.load("nestedElements.html")
41
result = driver.execute_script("return document.getElementsByName('checky').length")
42
43
assert isinstance(result, int)
44
assert int(result) > 1
45
46
47
def test_should_be_able_to_execute_simple_javascript_and_return_aweb_element(driver, pages):
48
pages.load("xhtmlTest.html")
49
50
result = driver.execute_script("return document.getElementById('id1')")
51
52
assert result is not None
53
assert isinstance(result, WebElement)
54
assert "a" == result.tag_name.lower()
55
56
57
def test_should_be_able_to_execute_simple_javascript_and_return_alist_of_web_elements(driver, pages):
58
pages.load("xhtmlTest.html")
59
60
result = driver.execute_script("return document.querySelectorAll('div.navigation a')")
61
62
assert result is not None
63
assert isinstance(result, list)
64
assert all(isinstance(item, WebElement) for item in result)
65
assert all("a" == item.tag_name.lower() for item in result)
66
67
68
def test_should_be_able_to_execute_simple_javascript_and_return_web_elements_inside_alist(driver, pages):
69
pages.load("xhtmlTest.html")
70
71
result = driver.execute_script("return [document.body]")
72
73
assert result is not None
74
assert isinstance(result, list)
75
assert isinstance(result[0], WebElement)
76
77
78
def test_should_be_able_to_execute_simple_javascript_and_return_web_elements_inside_anested_list(driver, pages):
79
pages.load("xhtmlTest.html")
80
81
result = driver.execute_script("return [document.body, [document.getElementById('id1')]]")
82
83
assert result is not None
84
assert isinstance(result, list)
85
assert isinstance(result[0], WebElement)
86
assert isinstance(result[1][0], WebElement)
87
88
89
def test_should_be_able_to_execute_simple_javascript_and_return_web_elements_inside_adict(driver, pages):
90
pages.load("xhtmlTest.html")
91
92
result = driver.execute_script("return {el1: document.body}")
93
94
assert result is not None
95
assert isinstance(result, dict)
96
assert isinstance(result.get("el1"), WebElement)
97
98
99
def test_should_be_able_to_execute_simple_javascript_and_return_web_elements_inside_anested_dict(driver, pages):
100
pages.load("xhtmlTest.html")
101
102
result = driver.execute_script("return {el1: document.body, nested: {el2: document.getElementById('id1')}}")
103
104
assert result is not None
105
assert isinstance(result, dict)
106
assert isinstance(result.get("el1"), WebElement)
107
assert isinstance(result.get("nested").get("el2"), WebElement)
108
109
110
def test_should_be_able_to_execute_simple_javascript_and_return_web_elements_inside_alist_inside_adict(driver, pages):
111
pages.load("xhtmlTest.html")
112
113
result = driver.execute_script("return {el1: [document.body]}")
114
115
assert result is not None
116
assert isinstance(result, dict)
117
assert isinstance(result.get("el1"), list)
118
assert isinstance(result.get("el1")[0], WebElement)
119
120
121
def test_should_be_able_to_execute_simple_javascript_and_return_aboolean(driver, pages):
122
pages.load("xhtmlTest.html")
123
124
result = driver.execute_script("return true")
125
126
assert result is not None
127
assert isinstance(result, bool)
128
assert bool(result)
129
130
131
def test_should_be_able_to_execute_simple_javascript_and_astrings_array(driver, pages):
132
pages.load("javascriptPage.html")
133
expectedResult = []
134
expectedResult.append("zero")
135
expectedResult.append("one")
136
expectedResult.append("two")
137
result = driver.execute_script("return ['zero', 'one', 'two']")
138
139
assert expectedResult == result
140
141
142
def test_should_be_able_to_execute_simple_javascript_and_return_an_array(driver, pages):
143
pages.load("javascriptPage.html")
144
expectedResult = []
145
expectedResult.append("zero")
146
subList = []
147
subList.append(True)
148
subList.append(False)
149
expectedResult.append(subList)
150
result = driver.execute_script("return ['zero', [true, false]]")
151
assert result is not None
152
assert isinstance(result, list)
153
assert expectedResult == result
154
155
156
def test_passing_and_returning_an_int_should_return_awhole_number(driver, pages):
157
pages.load("javascriptPage.html")
158
expectedResult = 1
159
result = driver.execute_script("return arguments[0]", expectedResult)
160
assert isinstance(result, int)
161
assert expectedResult == result
162
163
164
def test_passing_and_returning_adouble_should_return_adecimal(driver, pages):
165
pages.load("javascriptPage.html")
166
expectedResult = 1.2
167
result = driver.execute_script("return arguments[0]", expectedResult)
168
assert isinstance(result, float)
169
assert expectedResult == result
170
171
172
def test_should_throw_an_exception_when_the_javascript_is_bad(driver, pages):
173
pages.load("xhtmlTest.html")
174
with pytest.raises(WebDriverException):
175
driver.execute_script("return squiggle()")
176
177
178
def test_should_be_able_to_call_functions_defined_on_the_page(driver, pages):
179
pages.load("javascriptPage.html")
180
driver.execute_script("displayMessage('I like cheese')")
181
text = driver.find_element(By.ID, "result").text
182
assert "I like cheese" == text.strip()
183
184
185
def test_should_be_able_to_pass_astring_an_as_argument(driver, pages):
186
pages.load("javascriptPage.html")
187
value = driver.execute_script("return arguments[0] == 'fish' ? 'fish' : 'not fish'", "fish")
188
assert "fish" == value
189
190
191
def test_should_be_able_to_pass_aboolean_an_as_argument(driver, pages):
192
pages.load("javascriptPage.html")
193
value = bool(driver.execute_script("return arguments[0] == true", True))
194
assert value
195
196
197
def test_should_be_able_to_pass_anumber_an_as_argument(driver, pages):
198
pages.load("javascriptPage.html")
199
value = bool(driver.execute_script("return arguments[0] == 1 ? true : false", 1))
200
assert value
201
202
203
def test_should_be_able_to_pass_aweb_element_as_argument(driver, pages):
204
pages.load("javascriptPage.html")
205
button = driver.find_element(By.ID, "plainButton")
206
value = driver.execute_script(
207
"arguments[0]['flibble'] = arguments[0].getAttribute('id'); return arguments[0]['flibble']", button
208
)
209
assert "plainButton" == value
210
211
212
def test_should_be_able_to_pass_an_array_as_argument(driver, pages):
213
pages.load("javascriptPage.html")
214
array = ["zero", 1, True, 3.14159]
215
length = int(driver.execute_script("return arguments[0].length", array))
216
assert len(array) == length
217
218
219
def test_should_be_able_to_pass_acollection_as_argument(driver, pages):
220
pages.load("javascriptPage.html")
221
collection = []
222
collection.append("Cheddar")
223
collection.append("Brie")
224
collection.append(7)
225
length = int(driver.execute_script("return arguments[0].length", collection))
226
assert len(collection) == length
227
228
collection = []
229
collection.append("Gouda")
230
collection.append("Stilton")
231
collection.append("Stilton")
232
collection.append(True)
233
length = int(driver.execute_script("return arguments[0].length", collection))
234
assert len(collection) == length
235
236
237
def test_should_throw_an_exception_if_an_argument_is_not_valid(driver, pages):
238
pages.load("javascriptPage.html")
239
with pytest.raises(Exception):
240
driver.execute_script("return arguments[0]", driver)
241
242
243
def test_should_be_able_to_pass_in_more_than_one_argument(driver, pages):
244
pages.load("javascriptPage.html")
245
result = driver.execute_script("return arguments[0] + arguments[1]", "one", "two")
246
assert "onetwo" == result
247
248
249
def test_javascript_string_handling_should_work_as_expected(driver, pages):
250
pages.load("javascriptPage.html")
251
value = driver.execute_script("return ''")
252
assert "" == value
253
254
value = driver.execute_script("return undefined")
255
assert value is None
256
257
value = driver.execute_script("return ' '")
258
assert " " == value
259
260
261
def test_should_be_able_to_create_apersistent_value(driver, pages):
262
pages.load("formPage.html")
263
driver.execute_script("document.alerts = []")
264
driver.execute_script("document.alerts.push('hello world')")
265
text = driver.execute_script("return document.alerts.shift()")
266
assert "hello world" == text
267
268
269
def test_can_pass_adictionary_as_aparameter(driver, pages):
270
pages.load("simpleTest.html")
271
nums = [1, 2]
272
args = {"bar": "test", "foo": nums}
273
res = driver.execute_script("return arguments[0]['foo'][1]", args)
274
assert 2 == res
275
276
277
def test_can_pass_anone(driver, pages):
278
pages.load("simpleTest.html")
279
res = driver.execute_script("return arguments[0] === null", None)
280
assert res
281
282
283
def test_can_return_a_const(driver, pages):
284
pages.load("simpleTest.html")
285
res = driver.execute_script("const cheese='cheese'; return cheese")
286
assert res == "cheese"
287
288
289
def test_can_return_a_const_in_a_page(driver, pages):
290
pages.load("const_js.html")
291
res = driver.execute_script("return makeMeA('sandwich');")
292
assert res == "cheese sandwich"
293
294
295
@pytest.mark.xfail_remote
296
@pytest.mark.xfail_firefox
297
def test_can_return_global_const(driver, pages):
298
pages.load("const_js.html")
299
# cheese is a variable with "cheese" in it
300
res = driver.execute_script("return cheese")
301
assert res == "cheese"
302
303