def test_eval(page: Page): page.goto("http://localhost:8000/calculator.html") page.click("#btnEql") # page.screenshot(path=f"boo.png") assert page.query_selector("#result").inner_text() == "0"
def test_locator_should_support_has_locator(page: Page, server: Server) -> None: page.set_content("<div><span>hello</span></div><div><span>world</span></div>") expect(page.locator("div", has=page.locator("text=world"))).to_have_count(1) assert ( page.locator("div", has=page.locator("text=world")).evaluate("e => e.outerHTML") == "<div><span>world</span></div>" ) expect(page.locator("div", has=page.locator('text="hello"'))).to_have_count(1) assert ( page.locator("div", has=page.locator('text="hello"')).evaluate( "e => e.outerHTML" ) == "<div><span>hello</span></div>" ) expect(page.locator("div", has=page.locator("xpath=./span"))).to_have_count(2) expect(page.locator("div", has=page.locator("span"))).to_have_count(2) expect(page.locator("div", has=page.locator("span", has_text="wor"))).to_have_count( 1 ) assert ( page.locator("div", has=page.locator("span", has_text="wor")).evaluate( "e => e.outerHTML" ) == "<div><span>world</span></div>" ) expect( page.locator( "div", has=page.locator("span"), has_text="wor", ) ).to_have_count(1)
def test_locators_get_attribute_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/dom.html") button = page.locator("#outer") assert button.get_attribute("name") == "value" assert button.get_attribute("foo") is None
def test_locators_should_type(page: Page) -> None: page.set_content("<input type='text' />") page.locator("input").type("hello") page.eval_on_selector("input", "input => input.value") == "hello"
def test_locator_query_should_filter_by_regex(page: Page, server: Server) -> None: page.set_content("<div>Foobar</div><div>Bar</div>") expect(page.locator("div", has_text=re.compile(r"Foo.*"))).to_have_text("Foobar")
def test_locators_select_option_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/input/select.html") select = page.locator("select") select.select_option("blue") assert page.evaluate("result.onInput") == ["blue"] assert page.evaluate("result.onChange") == ["blue"]
def test_locators_focus_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/input/button.html") button = page.locator("button") assert button.evaluate("button => document.activeElement === button") is False button.focus() assert button.evaluate("button => document.activeElement === button") is True
def test_accessibility_orientation(page: Page) -> None: page.set_content('<a href="" role="slider" aria-orientation="vertical">11</a>') snapshot = page.accessibility.snapshot() assert snapshot assert snapshot["children"][0]["orientation"] == "vertical"
def test_accessibility_autocomplete(page: Page) -> None: page.set_content('<div role="textbox" aria-autocomplete="list">hi</div>') snapshot = page.accessibility.snapshot() assert snapshot assert snapshot["children"][0]["autocomplete"] == "list"
def test_integer_operations(page: Page, buttons, result): page.goto("http://localhost:8000/calculator.html") for btn in buttons: page.click(f"#btn{btn}") assert int(page.query_selector("#result").inner_text()) == result
def test_accessibility_roledescription(page: Page) -> None: page.set_content('<p tabIndex=-1 aria-roledescription="foo">Hi</p>') snapshot = page.accessibility.snapshot() assert snapshot assert snapshot["children"][0]["roledescription"] == "foo"
def test_infinity(page: Page): page.goto("http://localhost:8000/calculator.html") page.click("#btn1") page.click("#btnDiv") page.click("#btn0") page.click("#btnEql") assert page.query_selector("#result").inner_text() == "Infinity"
def test_error(page: Page): page.goto("http://localhost:8000/calculator.html") page.click("#btn1") page.click("#btnSum") page.click("#btnSum") page.click("#btn2") page.click("#btnEql") assert page.query_selector("#result").inner_text() == "ERROR"
def test_clear(page: Page): page.goto("http://localhost:8000/calculator.html") page.click("#btn1") page.click("#btnClr") assert page.query_selector("#result").inner_text() == "0"
def test_locators_fill_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/input/textarea.html") button = page.locator("input") button.fill("some value") assert page.evaluate("result") == "some value"
def test_accessibility_multiselectable(page: Page) -> None: page.set_content('<div role="grid" tabIndex=-1 aria-multiselectable=true>hey</div>') snapshot = page.accessibility.snapshot() assert snapshot assert snapshot["children"][0]["multiselectable"]
def test_locators_uncheck_should_work(page: Page) -> None: page.set_content("<input id='checkbox' type='checkbox' checked></input>") button = page.locator("input") button.uncheck() assert page.evaluate("checkbox.checked") is False
def test_accessibility_keyshortcuts(page: Page) -> None: page.set_content('<div role="grid" tabIndex=-1 aria-keyshortcuts="foo">hey</div>') snapshot = page.accessibility.snapshot() assert snapshot assert snapshot["children"][0]["keyshortcuts"] == "foo"
def test_locators_click_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/input/button.html") button = page.locator("button") button.click() assert page.evaluate("window['result']") == "Clicked"
def test_accessibility_should_work( page: Page, is_firefox: bool, is_chromium: bool ) -> None: page.set_content( """<head> <title>Accessibility Test</title> </head> <body> <h1>Inputs</h1> <input placeholder="Empty input" autofocus /> <input placeholder="readonly input" readonly /> <input placeholder="disabled input" disabled /> <input aria-label="Input with whitespace" value=" " /> <input value="value only" /> <input aria-placeholder="placeholder" value="and a value" /> <div aria-hidden="true" id="desc">This is a description!</div> <input aria-placeholder="placeholder" value="and a value" aria-describedby="desc" /> </body>""" ) # autofocus happens after a delay in chrome these days page.wait_for_function("document.activeElement.hasAttribute('autofocus')") if is_firefox: golden = { "role": "document", "name": "Accessibility Test", "children": [ {"role": "heading", "name": "Inputs", "level": 1}, {"role": "textbox", "name": "Empty input", "focused": True}, {"role": "textbox", "name": "readonly input", "readonly": True}, {"role": "textbox", "name": "disabled input", "disabled": True}, {"role": "textbox", "name": "Input with whitespace", "value": " "}, {"role": "textbox", "name": "", "value": "value only"}, { "role": "textbox", "name": "", "value": "and a value", }, # firefox doesn't use aria-placeholder for the name { "role": "textbox", "name": "", "value": "and a value", "description": "This is a description!", }, # and here ], } elif is_chromium: golden = { "role": "WebArea", "name": "Accessibility Test", "children": [ {"role": "heading", "name": "Inputs", "level": 1}, {"role": "textbox", "name": "Empty input", "focused": True}, {"role": "textbox", "name": "readonly input", "readonly": True}, {"role": "textbox", "name": "disabled input", "disabled": True}, {"role": "textbox", "name": "Input with whitespace", "value": " "}, {"role": "textbox", "name": "", "value": "value only"}, {"role": "textbox", "name": "placeholder", "value": "and a value"}, { "role": "textbox", "name": "placeholder", "value": "and a value", "description": "This is a description!", }, ], } else: golden = { "role": "WebArea", "name": "Accessibility Test", "children": [ {"role": "heading", "name": "Inputs", "level": 1}, {"role": "textbox", "name": "Empty input", "focused": True}, {"role": "textbox", "name": "readonly input", "readonly": True}, {"role": "textbox", "name": "disabled input", "disabled": True}, {"role": "textbox", "name": "Input with whitespace", "value": " "}, {"role": "textbox", "name": "", "value": "value only"}, {"role": "textbox", "name": "placeholder", "value": "and a value"}, { "role": "textbox", "name": "This is a description!", "value": "and a value", }, # webkit uses the description over placeholder for the name ], } assert page.accessibility.snapshot() == golden
def test_locators_dispatch_event_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/input/button.html") button = page.locator("button") button.dispatch_event("click") assert page.evaluate("result") == "Clicked"
def test_sync_wait_for_event(page: Page, server): with page.expect_event("popup", timeout=10000) as popup: page.evaluate("(url) => window.open(url)", server.EMPTY_PAGE) assert popup.value
def test_locator_query_should_filter_by_text_2(page: Page, server: Server) -> None: page.set_content("<div>foo <span>hello world</span> bar</div>") expect(page.locator("div", has_text="hello world")).to_have_text( "foo hello world bar" )
def test_locators_return_empty_array_for_non_existing_elements(page: Page) -> None: page.set_content("""<html><body><div>A</div><br/><div>B</div></body></html>""") html = page.locator("html") elements = html.locator("abc").element_handles() assert len(elements) == 0 assert elements == []
def test_locator_query_should_filter_by_text_with_quotes( page: Page, server: Server ) -> None: page.set_content('<div>Hello "world"</div><div>Hello world</div>') expect(page.locator("div", has_text='Hello "world"')).to_have_text('Hello "world"')
def test_locators_evaluate_all_should_work_with_missing_selector(page: Page) -> None: page.set_content("""<div class="a">not-a-child-div</div><div id="myId"></div""") tweet = page.locator("#myId .a") nodes_length = tweet.evaluate_all("nodes => nodes.length") assert nodes_length == 0
def test_should_support_locator_filter(page: Page) -> None: page.set_content( "<section><div><span>hello</span></div><div><span>world</span></div></section>" ) expect(page.locator("div").filter(has_text="hello")).to_have_count(1) expect( page.locator("div", has_text="hello").filter(has_text="hello") ).to_have_count(1) expect( page.locator("div", has_text="hello").filter(has_text="world") ).to_have_count(0) expect( page.locator("section", has_text="hello").filter(has_text="world") ).to_have_count(1) expect(page.locator("div").filter(has_text="hello").locator("span")).to_have_count( 1 ) expect( page.locator("div").filter(has=page.locator("span", has_text="world")) ).to_have_count(1) expect(page.locator("div").filter(has=page.locator("span"))).to_have_count(2) expect( page.locator("div").filter( has=page.locator("span"), has_text="world", ) ).to_have_count(1)
def test_locators_hover_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/input/scrollable.html") button = page.locator("#button-6") button.hover() assert page.evaluate("document.querySelector('button:hover').id") == "button-6"
def test_locators_input_value_should_work(page: Page, server: Server) -> None: page.goto(server.PREFIX + "/dom.html") page.fill("#textarea", "input value") text_area = page.locator("#textarea") assert text_area.input_value() == "input value"
def test_lti_bbb_create_enabled(page: Page, live_server: LiveServer, settings): """Test LTI BBB classroom create.""" settings.BBB_ENABLED = True # Backend requests mocking responses.add( responses.GET, "https://10.7.7.1/bigbluebutton/api/create", body="""<response> <returncode>SUCCESS</returncode> <meetingID>12345</meetingID> <internalMeetingID>232a8ab5dbfde4d33a2bd9d5bbc08bd74d04e163-1628693645640</internalMeetingID> <parentMeetingID>bbb-none</parentMeetingID> <attendeePW>9#R1kuUl3R</attendeePW> <moderatorPW>0$C7Aaz0o</moderatorPW> <createTime>1628693645640</createTime> <voiceBridge>83267</voiceBridge> <dialNumber>613-555-1234</dialNumber> <createDate>Wed Aug 11 14:54:05 UTC 2021</createDate> <hasUserJoined>false</hasUserJoined> <duration>0</duration> <hasBeenForciblyEnded>false</hasBeenForciblyEnded> <messageKey></messageKey> <message></message> </response> """, status=200, ) responses.add( responses.GET, "https://10.7.7.1/bigbluebutton/api/getMeetingInfo", body="""<response> <returncode>FAILED</returncode> <messageKey>notFound</messageKey> <message>We could not find a meeting with that meeting ID</message> </response> """, status=200, ) responses.add( responses.GET, "https://10.7.7.1/bigbluebutton/api/join", body=""" <response> <returncode>SUCCESS</returncode> <messageKey>successfullyJoined</messageKey> <message>You have joined successfully.</message> <meeting_id>74f4b5fefa00d05889a9095d1c81c51f704a74c0-1632323106549</meeting_id> <user_id>w_cmlgpuqzkqez</user_id> <auth_token>pcwfqes0ugkb</auth_token> <session_token>4vtuguoqsolsqkqi</session_token> <guestStatus>ALLOW</guestStatus> <url>https://10.7.7.1/html5client/join?sessionToken=4vtuguoqsolsqkqi</url> </response> """, status=200, ) # Frontend requests mocking page.context.route( "https://10.7.7.1/bigbluebutton/api/join*", lambda route: route.fulfill( status=200, body="BBB classroom joined!", ), ) page, _ = _preview_classroom(page, live_server) page.fill("text=Title", "Classroom title") page.click("text=Launch the classroom now in BBB") with page.expect_event("popup") as bbb_classroom_page_info: page.click("text=Join classroom") bbb_classroom_page = bbb_classroom_page_info.value bbb_classroom_page.wait_for_load_state() assert "BBB classroom joined!" in bbb_classroom_page.content()