test_1954533_copaair_com.py (5998B)
1 import pytest 2 3 URL = "https://www.copaair.com/en-gs/enrollment/" 4 5 COOKIES_CSS = ".MuiBox-root:has(img[src*=Cookies])" 6 CAPTCHA_CSS = "iframe[src*='Incapsula_Resource']" 7 NAME_CSS = "#input-name" 8 SURNAME_CSS = "#input-lastName" 9 YEAR_SELECTOR_CSS = "#year" 10 YEAR_CSS = "#year-open [data-value='1978']" 11 MONTH_SELECTOR_CSS = "#month" 12 MONTH_CSS = "#month-open [data-value='3']" 13 DAY_SELECTOR_CSS = "#day" 14 DAY_CSS = "#day-open [data-value='6']" 15 GENDER_SELECTOR_CSS = "#gender" 16 GENDER_MALE_CSS = "#menu-gender [data-value='Male']" 17 COUNTRY_SELECTOR_CSS = "[aria-label='enrollmentFormNationalityWCAG'] #option" 18 COUNTRY_CSS = "#option-open [data-value='CA'], #option-open [data-value='0']" 19 COUNTRY_RESIDENCE_SELECTOR_CSS = ( 20 "[aria-label='enrollmentFormResidenceCountryWCAG'] #option" 21 ) 22 COUNTRY_RESIDENCE_CSS = "#option-open [data-value='CA'], #option-open [data-value='0']" 23 DOC_SELECTOR_CSS = "#memberDoc" 24 DOC_CSS = "#memberDoc-open [aria-label='Passport']" 25 DOC_NUMBER_CSS = "[id='input-memberDoc.documentId']" 26 DOC_COUNTRY_SELECTOR_CSS = "[id='memberDoc.issuingCountry']" 27 DOC_COUNTRY_CSS = "[id='memberDoc.issuingCountry-open'] [data-value='CA'], [id='memberDoc.issuingCountry-open'] [data-value='0']" 28 DOC_YEAR_SELECTOR_CSS = "div:has(+ input[name='memberDoc.validUntil.year'])" 29 DOC_YEAR_CSS = "#year-open [data-value='2035']" 30 DOC_MONTH_SELECTOR_CSS = "div:has(+ input[name='memberDoc.validUntil.month'])" 31 DOC_MONTH_CSS = "#month-open [data-value='7']" 32 DOC_DAY_SELECTOR_CSS = "div:has(+ input[name='memberDoc.validUntil.day'])" 33 DOC_DAY_CSS = "#day-open [data-value='12']" 34 EMAIL_CSS = "#input-email" 35 PASSWORD_CSS = "#password-input-password" 36 CREATE_BUTTON_TEXT = "Create an account" 37 ACCEPT_BUTTON_TEXT = "Accept" 38 OOPS_CSS = "img[alt='Connectmiles Logo']" 39 DIALOG_BUTTONS_CSS = "#contentContainerModal+.MuiBox-root button" 40 FAIL_MSG = """TypeError: can't access property "innerText", document.querySelector(...) is null""" 41 42 43 async def get_accept_button(client, in_headless_mode): 44 await client.make_preload_script("delete navigator.__proto__.webdriver") 45 await client.make_preload_script( 46 "Object.defineProperty(window, 'y', {get: () => document.head, configurable:true})" 47 ) 48 await client.navigate(URL) 49 captcha, name = client.await_first_element_of( 50 [ 51 client.css(CAPTCHA_CSS), 52 client.css(NAME_CSS), 53 ], 54 is_displayed=True, 55 ) 56 if captcha: 57 if in_headless_mode: 58 pytest.xfail("Captcha cannot be done in headless mode") 59 return 60 print( 61 "Please do Captcha...\a\n" 62 ) # beep to let the user know to do the reCAPTCHA 63 client.hide_elements(COOKIES_CSS) 64 client.await_css(NAME_CSS, is_displayed=True).send_keys("webcompat") 65 client.await_css(SURNAME_CSS, is_displayed=True).send_keys("tester") 66 client.click(client.await_css(YEAR_SELECTOR_CSS, is_displayed=True), force=True) 67 client.click(client.await_css(YEAR_CSS, is_displayed=True), force=True) 68 client.click(client.await_css(MONTH_SELECTOR_CSS, is_displayed=True), force=True) 69 client.click(client.await_css(MONTH_CSS, is_displayed=True), force=True) 70 client.click(client.await_css(DAY_SELECTOR_CSS, is_displayed=True), force=True) 71 client.click(client.await_css(DAY_CSS, is_displayed=True), force=True) 72 client.click(client.await_css(GENDER_SELECTOR_CSS, is_displayed=True), force=True) 73 client.click(client.await_css(GENDER_MALE_CSS, is_displayed=True), force=True) 74 client.click(client.await_css(COUNTRY_SELECTOR_CSS, is_displayed=True), force=True) 75 client.soft_click(client.await_css(COUNTRY_CSS, is_displayed=True)) 76 client.click( 77 client.await_css(COUNTRY_RESIDENCE_SELECTOR_CSS, is_displayed=True), force=True 78 ) 79 client.soft_click(client.await_css(COUNTRY_RESIDENCE_CSS, is_displayed=True)) 80 client.click(client.await_css(DOC_SELECTOR_CSS, is_displayed=True), force=True) 81 client.click(client.await_css(DOC_CSS, is_displayed=True), force=True) 82 client.await_css(DOC_NUMBER_CSS, is_displayed=True).send_keys("1235123") 83 client.click( 84 client.await_css(DOC_COUNTRY_SELECTOR_CSS, is_displayed=True), force=True 85 ) 86 client.click(client.await_css(DOC_COUNTRY_CSS, is_displayed=True), force=True) 87 client.click(client.await_css(DOC_YEAR_SELECTOR_CSS, is_displayed=True), force=True) 88 client.click(client.await_css(DOC_YEAR_CSS, is_displayed=True), force=True) 89 client.click( 90 client.await_css(DOC_MONTH_SELECTOR_CSS, is_displayed=True), force=True 91 ) 92 client.click(client.await_css(DOC_MONTH_CSS, is_displayed=True), force=True) 93 client.click(client.await_css(DOC_DAY_SELECTOR_CSS, is_displayed=True), force=True) 94 client.click(client.await_css(DOC_DAY_CSS, is_displayed=True), force=True) 95 client.await_css(EMAIL_CSS, is_displayed=True).send_keys( 96 "webcompatTester@gmail.com" 97 ) 98 client.await_css(PASSWORD_CSS, is_displayed=True).send_keys("A1b2_xxx") 99 create = client.await_text(CREATE_BUTTON_TEXT, is_displayed=True) 100 client.execute_async_script( 101 """ 102 const [btn, done] = arguments; 103 timer = setInterval(() => { 104 if (!btn.hasAttribute("disabled")) { 105 clearInterval(timer); 106 done(); 107 } 108 }, 100); 109 """, 110 create, 111 ) 112 await client.stall(1) 113 client.soft_click(create) 114 return client.await_css( 115 DIALOG_BUTTONS_CSS, 116 condition=f"elem.innerText.includes('{ACCEPT_BUTTON_TEXT}')", 117 is_displayed=True, 118 ) 119 120 121 @pytest.mark.asyncio 122 @pytest.mark.with_interventions 123 async def test_with_interventions(client, in_headless_mode): 124 client.soft_click(await get_accept_button(client, in_headless_mode)) 125 assert client.await_css(OOPS_CSS, is_displayed=True) 126 127 128 @pytest.mark.asyncio 129 @pytest.mark.without_interventions 130 async def test_disabled(client, in_headless_mode): 131 client.soft_click(await get_accept_button(client, in_headless_mode)) 132 await (await client.promise_console_message_listener(FAIL_MSG))