Best Python code snippet using playwright-python
test_element_handle.py
Source:test_element_handle.py
1# Copyright (c) Microsoft Corporation.2#3# Licensed under the Apache License, Version 2.0 (the "License");4# you may not use this file except in compliance with the License.5# You may obtain a copy of the License at6#7# http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS,11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12# See the License for the specific language governing permissions and13# limitations under the License.14import pytest15from playwright.sync_api import Error16def test_bounding_box(page, server):17 page.set_viewport_size({"width": 500, "height": 500})18 page.goto(server.PREFIX + "/grid.html")19 element_handle = page.query_selector(".box:nth-of-type(13)")20 box = element_handle.bounding_box()21 assert box == {"x": 100, "y": 50, "width": 50, "height": 50}22def test_bounding_box_handle_nested_frames(page, server):23 page.set_viewport_size({"width": 500, "height": 500})24 page.goto(server.PREFIX + "/frames/nested-frames.html")25 nested_frame = page.frame(name="dos")26 element_handle = nested_frame.query_selector("div")27 box = element_handle.bounding_box()28 assert box == {"x": 24, "y": 224, "width": 268, "height": 18}29def test_bounding_box_return_null_for_invisible_elements(page, server):30 page.set_content('<div style="display:none">hi</div>')31 element = page.query_selector("div")32 assert element.bounding_box() is None33def test_bounding_box_force_a_layout(page, server):34 page.set_viewport_size({"width": 500, "height": 500})35 page.set_content('<div style="width: 100px; height: 100px">hello</div>')36 element_handle = page.query_selector("div")37 page.evaluate('element => element.style.height = "200px"', element_handle)38 box = element_handle.bounding_box()39 assert box == {"x": 8, "y": 8, "width": 100, "height": 200}40def test_bounding_box_with_SVG_nodes(page, server):41 page.set_content(42 """<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">43 <rect id="theRect" x="30" y="50" width="200" height="300"></rect>44 </svg>"""45 )46 element = page.query_selector("#therect")47 pw_bounding_box = element.bounding_box()48 web_bounding_box = page.evaluate(49 """e => {50 rect = e.getBoundingClientRect()51 return {x: rect.x, y: rect.y, width: rect.width, height: rect.height}52 }""",53 element,54 )55 assert pw_bounding_box == web_bounding_box56def test_bounding_box_with_page_scale(browser, server):57 context = browser.new_context(58 viewport={"width": 400, "height": 400, "is_mobile": True}59 )60 page = context.new_page()61 page.goto(server.PREFIX + "/input/button.html")62 button = page.query_selector("button")63 button.evaluate(64 """button => {65 document.body.style.margin = '0'66 button.style.borderWidth = '0'67 button.style.width = '200px'68 button.style.height = '20px'69 button.style.marginLeft = '17px'70 button.style.marginTop = '23px'71 }"""72 )73 box = button.bounding_box()74 assert round(box["x"] * 100) == 17 * 10075 assert round(box["y"] * 100) == 23 * 10076 assert round(box["width"] * 100) == 200 * 10077 assert round(box["height"] * 100) == 20 * 10078 context.close()79def test_bounding_box_when_inline_box_child_is_outside_of_viewport(page, server):80 page.set_content(81 """82 <style>83 i {84 position: absolute85 top: -1000px86 }87 body {88 margin: 089 font-size: 12px90 }91 </style>92 <span><i>woof</i><b>doggo</b></span>93 """94 )95 handle = page.query_selector("span")96 box = handle.bounding_box()97 web_bounding_box = handle.evaluate(98 """e => {99 rect = e.getBoundingClientRect();100 return {x: rect.x, y: rect.y, width: rect.width, height: rect.height};101 }"""102 )103 def roundbox(b):104 return {105 "x": round(b["x"] * 100),106 "y": round(b["y"] * 100),107 "width": round(b["width"] * 100),108 "height": round(b["height"] * 100),109 }110 assert roundbox(box) == roundbox(web_bounding_box)111def test_content_frame(page, server, utils):112 page.goto(server.EMPTY_PAGE)113 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)114 element_handle = page.query_selector("#frame1")115 frame = element_handle.content_frame()116 assert frame == page.frames[1]117def test_content_frame_for_non_iframes(page, server, utils):118 page.goto(server.EMPTY_PAGE)119 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)120 frame = page.frames[1]121 element_handle = frame.evaluate_handle("document.body")122 assert element_handle.content_frame() is None123def test_content_frame_for_document_element(page, server, utils):124 page.goto(server.EMPTY_PAGE)125 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)126 frame = page.frames[1]127 element_handle = frame.evaluate_handle("document.documentElement")128 assert element_handle.content_frame() is None129def test_owner_frame(page, server, utils):130 page.goto(server.EMPTY_PAGE)131 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)132 frame = page.frames[1]133 element_handle = frame.evaluate_handle("document.body")134 assert element_handle.owner_frame() == frame135def test_owner_frame_for_cross_process_iframes(page, server, utils):136 page.goto(server.EMPTY_PAGE)137 utils.attach_frame(page, "frame1", server.CROSS_PROCESS_PREFIX + "/empty.html")138 frame = page.frames[1]139 element_handle = frame.evaluate_handle("document.body")140 assert element_handle.owner_frame() == frame141def test_owner_frame_for_document(page, server, utils):142 page.goto(server.EMPTY_PAGE)143 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)144 frame = page.frames[1]145 element_handle = frame.evaluate_handle("document")146 assert element_handle.owner_frame() == frame147def test_owner_frame_for_iframe_elements(page, server, utils):148 page.goto(server.EMPTY_PAGE)149 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)150 frame = page.main_frame151 element_handle = frame.evaluate_handle('document.querySelector("#frame1")')152 print(element_handle)153 assert element_handle.owner_frame() == frame154def test_owner_frame_for_cross_frame_evaluations(page, server, utils):155 page.goto(server.EMPTY_PAGE)156 utils.attach_frame(page, "frame1", server.EMPTY_PAGE)157 frame = page.main_frame158 element_handle = frame.evaluate_handle(159 'document.querySelector("#frame1").contentWindow.document.body'160 )161 assert element_handle.owner_frame() == frame.child_frames[0]162def test_owner_frame_for_detached_elements(page, server):163 page.goto(server.EMPTY_PAGE)164 div_handle = page.evaluate_handle(165 """() => {166 div = document.createElement('div');167 document.body.appendChild(div);168 return div;169 }"""170 )171 assert div_handle.owner_frame() == page.main_frame172 page.evaluate(173 """() => {174 div = document.querySelector('div')175 document.body.removeChild(div)176 }"""177 )178 assert div_handle.owner_frame() == page.main_frame179def test_click(page, server):180 page.goto(server.PREFIX + "/input/button.html")181 button = page.query_selector("button")182 button.click()183 assert page.evaluate("result") == "Clicked"184def test_click_with_node_removed(page, server):185 page.goto(server.PREFIX + "/input/button.html")186 page.evaluate('delete window["Node"]')187 button = page.query_selector("button")188 button.click()189 assert page.evaluate("result") == "Clicked"190def test_click_for_shadow_dom_v1(page, server):191 page.goto(server.PREFIX + "/shadow.html")192 button_handle = page.evaluate_handle("button")193 button_handle.click()194 assert page.evaluate("clicked")195def test_click_for_TextNodes(page, server):196 page.goto(server.PREFIX + "/input/button.html")197 buttonTextNode = page.evaluate_handle('document.querySelector("button").firstChild')198 buttonTextNode.click()199 assert page.evaluate("result") == "Clicked"200def test_click_throw_for_detached_nodes(page, server):201 page.goto(server.PREFIX + "/input/button.html")202 button = page.query_selector("button")203 page.evaluate("button => button.remove()", button)204 with pytest.raises(Error) as exc_info:205 button.click()206 assert "Element is not attached to the DOM" in exc_info.value.message207def test_click_throw_for_hidden_nodes_with_force(page, server):208 page.goto(server.PREFIX + "/input/button.html")209 button = page.query_selector("button")210 page.evaluate('button => button.style.display = "none"', button)211 with pytest.raises(Error) as exc_info:212 button.click(force=True)213 assert "Element is not visible" in exc_info.value.message214def test_click_throw_for_recursively_hidden_nodes_with_force(page, server):215 page.goto(server.PREFIX + "/input/button.html")216 button = page.query_selector("button")217 page.evaluate('button => button.parentElement.style.display = "none"', button)218 with pytest.raises(Error) as exc_info:219 button.click(force=True)220 assert "Element is not visible" in exc_info.value.message221def test_click_throw_for__br__elements_with_force(page, server):222 page.set_content("hello<br>goodbye")223 br = page.query_selector("br")224 with pytest.raises(Error) as exc_info:225 br.click(force=True)226 assert "Element is outside of the viewport" in exc_info.value.message227def test_double_click_the_button(page, server):228 page.goto(server.PREFIX + "/input/button.html")229 page.evaluate(230 """() => {231 window.double = false;232 button = document.querySelector('button');233 button.addEventListener('dblclick', event => {234 window.double = true;235 });236 }"""237 )238 button = page.query_selector("button")239 button.dblclick()240 assert page.evaluate("double")241 assert page.evaluate("result") == "Clicked"242def test_hover(page, server):243 page.goto(server.PREFIX + "/input/scrollable.html")244 button = page.query_selector("#button-6")245 button.hover()246 assert page.evaluate('document.querySelector("button:hover").id') == "button-6"247def test_hover_when_node_is_removed(page, server):248 page.goto(server.PREFIX + "/input/scrollable.html")249 page.evaluate('delete window["Node"]')250 button = page.query_selector("#button-6")251 button.hover()252 assert page.evaluate('document.querySelector("button:hover").id') == "button-6"253def test_scroll(page, server):254 page.goto(server.PREFIX + "/offscreenbuttons.html")255 for i in range(11):256 button = page.query_selector(f"#btn{i}")257 before = button.evaluate(258 """button => {259 return button.getBoundingClientRect().right - window.innerWidth260 }"""261 )262 assert before == 10 * i263 button.scroll_into_view_if_needed()264 after = button.evaluate(265 """button => {266 return button.getBoundingClientRect().right - window.innerWidth267 }"""268 )269 assert after <= 0270 page.evaluate("() => window.scrollTo(0, 0)")271def test_scroll_should_throw_for_detached_element(page, server):272 page.set_content("<div>Hello</div>")273 div = page.query_selector("div")274 div.evaluate("div => div.remove()")275 with pytest.raises(Error) as exc_info:276 div.scroll_into_view_if_needed()277 assert "Element is not attached to the DOM" in exc_info.value.message278def test_should_timeout_waiting_for_visible(page):279 page.set_content('<div style="display:none">Hello</div>')280 div = page.query_selector("div")281 with pytest.raises(Error) as exc_info:282 div.scroll_into_view_if_needed(timeout=3000)283 assert "element is not visible" in exc_info.value.message284def test_fill_input(page, server):285 page.goto(server.PREFIX + "/input/textarea.html")286 handle = page.query_selector("input")287 handle.fill("some value")288 assert page.evaluate("result") == "some value"289def test_fill_input_when_Node_is_removed(page, server):290 page.goto(server.PREFIX + "/input/textarea.html")291 page.evaluate('delete window["Node"]')292 handle = page.query_selector("input")293 handle.fill("some value")294 assert page.evaluate("result") == "some value"295def test_select_textarea(page, server, is_firefox):296 page.goto(server.PREFIX + "/input/textarea.html")297 textarea = page.query_selector("textarea")298 textarea.evaluate('textarea => textarea.value = "some value"')299 textarea.select_text()300 if is_firefox:301 assert textarea.evaluate("el => el.selectionStart") == 0302 assert textarea.evaluate("el => el.selectionEnd") == 10303 else:304 assert page.evaluate("() => window.getSelection().toString()") == "some value"305def test_select_input(page, server, is_firefox):306 page.goto(server.PREFIX + "/input/textarea.html")307 input = page.query_selector("input")308 input.evaluate('input => input.value = "some value"')309 input.select_text()310 if is_firefox:311 assert input.evaluate("el => el.selectionStart") == 0312 assert input.evaluate("el => el.selectionEnd") == 10313 else:314 assert page.evaluate("() => window.getSelection().toString()") == "some value"315def test_select_text_select_plain_div(page, server):316 page.goto(server.PREFIX + "/input/textarea.html")317 div = page.query_selector("div.plain")318 div.select_text()319 assert page.evaluate("() => window.getSelection().toString()") == "Plain div"320def test_select_text_timeout_waiting_for_invisible_element(page, server):321 page.goto(server.PREFIX + "/input/textarea.html")322 textarea = page.query_selector("textarea")323 textarea.evaluate('e => e.style.display = "none"')324 with pytest.raises(Error) as exc_info:325 textarea.select_text(timeout=3000)326 assert "element is not visible" in exc_info.value.message327def test_a_nice_preview(page, server):328 page.goto(f"{server.PREFIX}/dom.html")329 outer = page.query_selector("#outer")330 inner = page.query_selector("#inner")331 check = page.query_selector("#check")332 text = inner.evaluate_handle("e => e.firstChild")333 page.evaluate("1") # Give them a chance to calculate the preview.334 assert str(outer) == 'JSHandle@<div id="outer" name="value">â¦</div>'335 assert str(inner) == 'JSHandle@<div id="inner">Text,âµmore text</div>'336 assert str(text) == "JSHandle@#text=Text,âµmore text"337 assert (338 str(check) == 'JSHandle@<input checked id="check" foo="bar"" type="checkbox"/>'339 )340def test_get_attribute(page, server):341 page.goto(f"{server.PREFIX}/dom.html")342 handle = page.query_selector("#outer")343 assert handle.get_attribute("name") == "value"344 assert page.get_attribute("#outer", "name") == "value"345def test_inner_html(page, server):346 page.goto(f"{server.PREFIX}/dom.html")347 handle = page.query_selector("#outer")348 assert handle.inner_html() == '<div id="inner">Text,\nmore text</div>'349 assert page.inner_html("#outer") == '<div id="inner">Text,\nmore text</div>'350def test_inner_text(page, server):351 page.goto(f"{server.PREFIX}/dom.html")352 handle = page.query_selector("#inner")353 assert handle.inner_text() == "Text, more text"354 assert page.inner_text("#inner") == "Text, more text"355def test_inner_text_should_throw(page, server):356 page.set_content("<svg>text</svg>")357 with pytest.raises(Error) as exc_info1:358 page.inner_text("svg")359 assert "Not an HTMLElement" in exc_info1.value.message360 handle = page.query_selector("svg")361 with pytest.raises(Error) as exc_info2:362 handle.inner_text()363 assert "Not an HTMLElement" in exc_info2.value.message364def test_text_content(page, server):365 page.goto(f"{server.PREFIX}/dom.html")366 handle = page.query_selector("#inner")367 assert handle.text_content() == "Text,\nmore text"368 assert page.text_content("#inner") == "Text,\nmore text"369def test_check_the_box(page):370 page.set_content('<input id="checkbox" type="checkbox"></input>')371 input = page.query_selector("input")372 input.check()373 assert page.evaluate("checkbox.checked")374def test_uncheck_the_box(page):375 page.set_content('<input id="checkbox" type="checkbox" checked></input>')376 input = page.query_selector("input")377 input.uncheck()378 assert page.evaluate("checkbox.checked") is False379def test_select_single_option(page, server):380 page.goto(server.PREFIX + "/input/select.html")381 select = page.query_selector("select")382 select.select_option(value="blue")383 assert page.evaluate("result.onInput") == ["blue"]384 assert page.evaluate("result.onChange") == ["blue"]385def test_focus_a_button(page, server):386 page.goto(server.PREFIX + "/input/button.html")387 button = page.query_selector("button")388 assert button.evaluate("button => document.activeElement === button") is False389 button.focus()390 assert button.evaluate("button => document.activeElement === button")391def test_is_visible_and_is_hidden_should_work(page):392 page.set_content("<div>Hi</div><span></span>")393 div = page.query_selector("div")394 assert div.is_visible()395 assert div.is_hidden() is False396 assert page.is_visible("div")397 assert page.is_hidden("div") is False398 span = page.query_selector("span")399 assert span.is_visible() is False400 assert span.is_hidden()401 assert page.is_visible("span") is False402 assert page.is_hidden("span")403def test_is_enabled_and_is_disabled_should_work(page):404 page.set_content(405 """406 <button disabled>button1</button>407 <button>button2</button>408 <div>div</div>409 """410 )411 div = page.query_selector("div")412 assert div.is_enabled()413 assert div.is_disabled() is False414 assert page.is_enabled("div")415 assert page.is_disabled("div") is False416 button1 = page.query_selector(":text('button1')")417 assert button1.is_enabled() is False418 assert button1.is_disabled()419 assert page.is_enabled(":text('button1')") is False420 assert page.is_disabled(":text('button1')")421 button2 = page.query_selector(":text('button2')")422 assert button2.is_enabled()423 assert button2.is_disabled() is False424 assert page.is_enabled(":text('button2')")425 assert page.is_disabled(":text('button2')") is False426def test_is_editable_should_work(page):427 page.set_content("<input id=input1 disabled><textarea></textarea><input id=input2>")428 page.eval_on_selector("textarea", "t => t.readOnly = true")429 input1 = page.query_selector("#input1")430 assert input1.is_editable() is False431 assert page.is_editable("#input1") is False432 input2 = page.query_selector("#input2")433 assert input2.is_editable()434 assert page.is_editable("#input2")435 textarea = page.query_selector("textarea")436 assert textarea.is_editable() is False437 assert page.is_editable("textarea") is False438def test_is_checked_should_work(page):439 page.set_content('<input type="checkbox" checked><div>Not a checkbox</div>')440 handle = page.query_selector("input")441 assert handle.is_checked()442 assert page.is_checked("input")443 handle.evaluate("input => input.checked = false")444 assert handle.is_checked() is False445 assert page.is_checked("input") is False446 with pytest.raises(Error) as exc_info:447 page.is_checked("div")...
test_shell_element.py
Source:test_shell_element.py
...83 with self.subTest(transform=transform):84 for element_handle in self.elements:85 if not (element_handle in self.thermal_elements):86 with self.subTest(element=element_handle):87 element = element_handle(transform, self.con)88 fail = elements.TestElementResidual(element, self.elem_index, self.time, self.xpts,89 self.vars, self.dvars, self.ddvars, dh,90 self.print_level, self.atol, rtol)91 self.assertFalse(fail)92 def test_element_jacobian(self):93 # Loop through every combination of transform type and shell element class and test Jacobian94 for transform in self.transforms:95 with self.subTest(transform=transform):96 for element_handle in self.elements:97 with self.subTest(element=element_handle):98 element = element_handle(transform, self.con)99 fail = elements.TestElementJacobian(element, self.elem_index, self.time, self.xpts,100 self.vars, self.dvars, self.ddvars, -1, self.dh,101 self.print_level, self.atol, self.rtol)102 self.assertFalse(fail)103 def test_adj_res_product(self):104 # Loop through every combination of transform type and shell element class and test adjoint residual-dvsens product105 for transform in self.transforms:106 with self.subTest(transform=transform):107 for element_handle in self.elements:108 with self.subTest(element=element_handle):109 element = element_handle(transform, self.con)110 dvs = element.getDesignVars(self.elem_index)111 fail = elements.TestAdjResProduct(element, self.elem_index, self.time, self.xpts,112 self.vars, self.dvars, self.ddvars, dvs, self.dh,113 self.print_level, self.atol, self.rtol)114 self.assertFalse(fail)115 def test_adj_res_xpt_product(self):116 # Loop through every combination of transform type and shell element class and test adjoint residual-xptsens product117 for transform in self.transforms:118 with self.subTest(transform=transform):119 for element_handle in self.elements:120 with self.subTest(element=element_handle):121 element = element_handle(transform, self.con)122 fail = elements.TestAdjResXptProduct(element, self.elem_index, self.time, self.xpts,123 self.vars, self.dvars, self.ddvars, self.dh,124 self.print_level, self.atol, self.rtol)125 self.assertFalse(fail)126 def test_element_mat_dv_sens(self):127 # Loop through every combination of transform type and shell element class and element matrix inner product sens128 for transform in self.transforms:129 with self.subTest(transform=transform):130 for element_handle in self.elements:131 with self.subTest(element=element_handle):132 element = element_handle(transform, self.con)133 dvs = element.getDesignVars(self.elem_index)134 for matrix_type in self.matrix_types:135 with self.subTest(matrix_type=matrix_type):136 fail = elements.TestElementMatDVSens(element, matrix_type, self.elem_index,137 self.time, self.xpts, self.vars, dvs, self.dh,138 self.print_level, self.atol, self.rtol)139 self.assertFalse(fail)140 def test_element_mat_sv_sens(self):141 # Loop through every combination of model and basis class and test element matrix inner product sens142 for transform in self.transforms:143 with self.subTest(transform=transform):144 for element_handle in self.elements:145 with self.subTest(element=element_handle):146 element = element_handle(transform, self.con)147 fail = elements.TestElementMatSVSens(element, TACS.GEOMETRIC_STIFFNESS_MATRIX, self.elem_index,148 self.time, self.xpts, self.vars, self.dh,149 self.print_level, self.atol, self.rtol)...
alarms.py
Source:alarms.py
1import weakref2from date_and_time import TimeSpan3import date_and_time4import elements5import services6import sims4.reload7import sims4.log8logger = sims4.log.Logger('Alarms')9with sims4.reload.protected(globals()):10 _ALARM_ELEMENT_HANDLES = {}11def add_alarm(owner,12 time_span,13 callback,14 repeating=False,15 repeating_time_span=None,16 use_sleep_time=True):17 ts = services.time_service()18 if ts.sim_timeline is None:19 logger.error('Attempting to create alarm after TimeService shutdown.')20 return21 if use_sleep_time:22 initial_time = ts.sim_timeline.now23 else:24 initial_time = ts.sim_timeline.future25 return AlarmHandle(owner,26 callback,27 ts.sim_timeline,28 initial_time + time_span,29 repeating=repeating,30 repeat_interval=repeating_time_span or time_span,31 accurate_repeat=use_sleep_time)32def add_alarm_real_time(owner,33 time_span,34 callback,35 repeating=False,36 use_sleep_time=True):37 ts = services.time_service()38 return AlarmHandle(owner,39 callback,40 ts.wall_clock_timeline,41 ts.wall_clock_timeline.now + time_span,42 repeating=repeating,43 repeat_interval=time_span,44 accurate_repeat=use_sleep_time)45def cancel_alarm(handle):46 handle.cancel()47class AlarmHandle:48 __qualname__ = 'AlarmHandle'49 __slots__ = ('_element_handle', '_owner_ref', '__weakref__')50 def __init__(self,51 owner,52 callback,53 t,54 when,55 repeating=False,56 repeat_interval=None,57 accurate_repeat=True):58 if owner is None:59 raise ValueError('Alarm created without owner')60 if not repeating:61 e = AlarmElement(callback)62 elif accurate_repeat:63 e = RepeatingAlarmElement(repeat_interval, callback)64 else:65 e = LossyRepeatingAlarmElement(repeat_interval, callback)66 self._element_handle = t.schedule(e, when)67 _register_auto_cleanup(self)68 self._owner_ref = weakref.ref(owner, self._owner_destroyed_callback)69 def _teardown(self):70 self._element_handle = None71 self._owner_ref = None72 @property73 def owner(self):74 if self._owner_ref is not None:75 return self._owner_ref()76 def _owner_destroyed_callback(self, _):77 if hasattr(self, '_element_handle'):78 self.cancel()79 def cancel(self):80 if self._element_handle is None:81 return82 _unregister_auto_cleanup(self._element_handle)83 timeline = self._element_handle.timeline84 if self._element_handle.is_active:85 self._element_handle._clear_element()86 else:87 timeline.hard_stop(self._element_handle)88 @property89 def timeline(self):90 return self._element_handle.timeline91 def get_remaining_time(self):92 timeline = self._element_handle.timeline93 when = self._element_handle.when94 if when is None:95 return TimeSpan.ZERO96 return when - timeline.now97 @property98 def finishing_time(self):99 when = self._element_handle.when100 if when is None:101 return date_and_time.DATE_AND_TIME_ZERO102 return when103class AlarmElement(elements.FunctionElement):104 __qualname__ = 'AlarmElement'105 __slots__ = ()106 @classmethod107 def shortname(cls):108 return 'Alarm'109 def __init__(self, callback):110 super().__init__(callback)111 def _run(self, t):112 result = self.callback(_lookup_alarm_handle(self._element_handle))113 _unregister_auto_cleanup(self._element_handle)114 return result115 def _teardown(self):116 alarm_handle = _lookup_alarm_handle(self._element_handle)117 if alarm_handle is not None:118 _unregister_auto_cleanup(self._element_handle)119 alarm_handle._teardown()120 super()._teardown()121class RepeatingAlarmElement(AlarmElement):122 __qualname__ = 'RepeatingAlarmElement'123 __slots__ = 'interval'124 @classmethod125 def shortname(cls):126 return 'RepeatingAlarm'127 def __init__(self, interval, callback):128 super().__init__(callback)129 self.interval = interval130 @staticmethod131 def timeline_now(t):132 return t.now133 def _run(self, t):134 element_handle = self._element_handle135 result = self.callback(_lookup_alarm_handle(element_handle))136 if not element_handle.canceled:137 when = self.timeline_now(t) + self.interval138 handle = t.schedule(self, when)139 return result140 def __str__(self):141 return '<{}; {}@{}; {}>'.format(142 self.shortname(), self.callback.__qualname__,143 self.callback.__code__.co_firstlineno, self.interval)144class LossyRepeatingAlarmElement(RepeatingAlarmElement):145 __qualname__ = 'LossyRepeatingAlarmElement'146 @staticmethod147 def timeline_now(t):148 return t.future149def _register_auto_cleanup(alarm_handle):150 element_handle = alarm_handle._element_handle151 def on_alarm_handle_collected(_):152 ehid = id(element_handle)153 if ehid in _ALARM_ELEMENT_HANDLES:154 del _ALARM_ELEMENT_HANDLES[ehid]155 timeline = element_handle.timeline156 timeline.hard_stop(element_handle)157 _ALARM_ELEMENT_HANDLES[id(element_handle)] = weakref.ref(158 alarm_handle, on_alarm_handle_collected)159def _unregister_auto_cleanup(element_handle):160 ehid = id(element_handle)161 if ehid in _ALARM_ELEMENT_HANDLES:162 del _ALARM_ELEMENT_HANDLES[ehid]163def _lookup_alarm_handle(element_handle):164 ehid = id(element_handle)165 return _ALARM_ELEMENT_HANDLES.get(ehid)()166def get_alarm_data_for_gsi():167 alarm_data = []168 for alarm_handle_ref in tuple(_ALARM_ELEMENT_HANDLES.values()):169 alarm_handle = alarm_handle_ref()170 if alarm_handle is None:171 pass172 element_handle = alarm_handle._element_handle173 element = element_handle.element174 if element is None:175 pass176 entry = {}177 entry['time'] = str(element_handle.when)178 entry['ticks'] = alarm_handle.get_remaining_time().in_ticks()179 entry['time_left'] = str(alarm_handle.get_remaining_time())180 owner = alarm_handle._owner_ref()181 if owner is None:182 owner_name = 'None Owner'183 else:184 owner_name = str(owner)185 entry['owner'] = owner_name186 entry['handle'] = id(alarm_handle)187 entry['callback'] = str(element.callback)188 alarm_data.append(entry)189 sort_key_fn = lambda data: data['ticks']190 alarm_data = sorted(alarm_data, key=sort_key_fn)...
middlewares.py
Source:middlewares.py
...67 lambda req: asyncio.create_task(self._get_intercept_request_body(req, page, request, response)))68 if request.select_element:69 # {'element_selector': {'action': '', 'value': ''}70 for element_selector, instructions in request.select_element.items():71 element_handle = await self.select_element_handle(element_selector, page)72 action = instructions.get('action')73 action_value = instructions.get('value')74 await self.make_action(action, action_value, element_handle, element_selector, page)75 if request.exec_pup:76 exec(request.exec_pup)77 if request.wait_for:78 await page.waitFor(request.wait_for,79 timeout=120000)80 if request.screenshot:81 request.meta['screenshot'] = await page.screenshot()82 if request.screenshot_element:83 element_ss_selector = request.screenshot_element84 await page.waitForSelector(element_ss_selector)85 element_ss = await page.querySelector(element_ss_selector)86 request.meta['element_ss'] = await element_ss.screenshot()87 self.html_response = await self.finish_puppeteer_scrape(page, request, response)88 return self.html_response89 except Exception as e:90 spider.logger.error(e)91 await page.close()92 async def _get_intercept_request_body(self, on_request, page, request, response):93 if on_request.url == request.intercept_request:94 response_text = await on_request.response.text()95 self.intercept_response_text = response_text96 else:97 pass98 async def make_action(self, action, action_value, element_handle, element_selector, page):99 if action == 'click':100 await element_handle.focus()101 await element_handle.click({'delay': random.randrange(200)})102 elif action == 'type':103 await element_handle.focus()104 await element_handle.type(action_value)105 elif action == 'select':106 await page.select(element_selector, action_value)107 else:108 raise CloseSpider('Unkown action')109 await asyncio.sleep(2)110 async def select_element_handle(self, element_selector, page):111 if '/' in element_selector:112 await page.waitForXPath(element_selector)113 element_handle = await page.xpath(element_selector)114 element_handle = element_handle[0]115 else:116 await page.waitForSelector(element_selector)117 element_handle = await page.querySelector(element_selector)118 return element_handle119 async def finish_puppeteer_scrape(self, page, request, response):120 pyp_cookies = await page.cookies()121 request.cookies = pyp_cookies122 if request.intercept_request:123 body = str.encode(self.intercept_response_text)124 else:...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!