예제 #1
0
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"
예제 #2
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)
예제 #3
0
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
예제 #4
0
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"
예제 #5
0
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")
예제 #6
0
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"]
예제 #7
0
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
예제 #8
0
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"
예제 #9
0
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"
예제 #10
0
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
예제 #11
0
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"
예제 #12
0
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"
예제 #13
0
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"
예제 #14
0
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"
예제 #15
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"
예제 #16
0
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"]
예제 #17
0
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
예제 #18
0
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"
예제 #19
0
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"
예제 #20
0
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
예제 #21
0
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"
예제 #22
0
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
예제 #23
0
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"
    )
예제 #24
0
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 == []
예제 #25
0
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"')
예제 #26
0
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
예제 #27
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)
예제 #28
0
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"
예제 #29
0
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"
예제 #30
0
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()