From 5647bb4ac91ef9870a9734f983a7f047024ebf6e Mon Sep 17 00:00:00 2001 From: Yevheniia Berdnyk Date: Fri, 1 Sep 2023 17:50:38 +0300 Subject: [PATCH] e2e: fixes navigation, long press and so on --- .../critical/chats/test_1_1_public_chats.py | 7 ++-- .../tests/critical/chats/test_group_chat.py | 2 +- .../critical/test_public_chat_browsing.py | 11 +++--- test/appium/views/base_view.py | 4 +-- test/appium/views/chat_view.py | 34 +++++++++++------- .../discovery_general_channel.png | Bin 1806 -> 1811 bytes test/appium/views/home_view.py | 6 ++-- 7 files changed, 40 insertions(+), 24 deletions(-) diff --git a/test/appium/tests/critical/chats/test_1_1_public_chats.py b/test/appium/tests/critical/chats/test_1_1_public_chats.py index 4fc295c4aab..01f1d01b468 100644 --- a/test/appium/tests/critical/chats/test_1_1_public_chats.py +++ b/test/appium/tests/critical/chats/test_1_1_public_chats.py @@ -1153,13 +1153,13 @@ def test_1_1_chat_push_emoji(self): chat_2 = self.device_2.click_upon_push_notification_by_text(message) self.device_2.just_fyi("Send emoji message to Device 1 while it's on background") + self.device_1.put_app_to_background() + self.device_1.open_notification_bar() emoji_message = random.choice(list(emoji.EMOJI_UNICODE)) emoji_unicode = emoji.EMOJI_UNICODE[emoji_message] chat_2.send_message(emoji.emojize(emoji_message)) self.device_1.just_fyi("Device 1 checks PN with emoji") - self.device_1.put_app_to_background() - self.device_1.open_notification_bar() if not self.device_1.element_by_text_part(emoji_unicode).is_element_displayed(60): self.device_1.click_system_back_button() self.device_1.status_in_background_button.click() @@ -1312,8 +1312,9 @@ def test_1_1_chat_text_message_delete_push_disappear(self): self.device_2.just_fyi("Send one more message and check that PN will be deleted with message deletion") message_to_delete = 'DELETE ME' self.home_1.put_app_to_background() - self.chat_2.send_message(message_to_delete) self.home_1.open_notification_bar() + self.chat_2.send_message(message_to_delete) + self.chat_2.chat_element_by_text(message_to_delete).wait_for_sent_state() if not self.home_1.get_pn(message_to_delete): self.home_1.click_system_back_button() self.home_1.status_in_background_button.click() diff --git a/test/appium/tests/critical/chats/test_group_chat.py b/test/appium/tests/critical/chats/test_group_chat.py index 0bf52db2c36..659caa67727 100644 --- a/test/appium/tests/critical/chats/test_group_chat.py +++ b/test/appium/tests/critical/chats/test_group_chat.py @@ -211,11 +211,11 @@ def test_group_chat_join_send_text_messages_push(self): message_to_admin = self.message_to_admin [self.homes[i].navigate_back_to_home_view() for i in range(3)] self.homes[1].get_chat(self.chat_name).click() + self.chats[0].open_notification_bar() self.chats[1].send_message(message_to_admin) self.chats[0].just_fyi('Check that PN is received and after tap you are redirected to group chat') - self.chats[0].open_notification_bar() pn = self.homes[0].get_pn(message_to_admin) if pn: pn.click() diff --git a/test/appium/tests/critical/test_public_chat_browsing.py b/test/appium/tests/critical/test_public_chat_browsing.py index 709a7a67523..b19f93d3fab 100644 --- a/test/appium/tests/critical/test_public_chat_browsing.py +++ b/test/appium/tests/critical/test_public_chat_browsing.py @@ -1,5 +1,6 @@ import datetime import random +import time from datetime import timedelta import emoji @@ -337,7 +338,7 @@ def test_community_discovery(self): for element, template in element_templates.items(): if element.is_element_differs_from_template(template): element.save_new_screenshot_of_element('%s_different.png' % element.name) - self.errors.append("%s is different from expected %s!" % (element.name, template)) + self.errors.append("Element %s is different from expected template %s!" % (element.locator, template)) self.errors.verify_no_errors() @marks.testrail_id(702846) @@ -348,6 +349,7 @@ def test_community_navigate_to_channel_when_relaunch(self): self.home.get_to_community_channel_from_home(self.community_name) self.channel.send_message(text_message) + self.channel.chat_element_by_text(text_message).wait_for_visibility_of_element() self.channel.reopen_app() if not self.channel.chat_element_by_text(text_message).is_element_displayed(30): self.drivers[0].fail("Not navigated to channel view after reopening app") @@ -577,6 +579,7 @@ def prepare_devices(self): self.chat_2.chat_element_by_text(self.community_name).view_community_button.click() self.community_2.join_community() self.channel_2 = self.community_2.get_channel(self.channel_name).click() + self.channel_2.chat_message_input.wait_for_visibility_of_element(20) @marks.testrail_id(702838) def test_community_message_send_check_timestamps_sender_username(self): @@ -1010,6 +1013,7 @@ def test_community_mark_all_messages_as_read(self): self.errors.append("New messages counter is not shown in community channel element") self.community_1.click_system_back_button() mark_as_read_button = self.community_1.mark_all_messages_as_read_button + self.home_1.community_floating_screen.wait_for_invisibility_of_element() community_1_element.long_press_until_element_is_shown(mark_as_read_button) mark_as_read_button.click() if community_1_element.new_messages_grey_dot.is_element_displayed(): @@ -1065,10 +1069,10 @@ def prepare_devices(self): self.channel_2 = self.community_2.get_channel(self.channel_name).click() @marks.testrail_id(702786) - @marks.xfail( - reason="Issue with username in PN, issue #6 in https://github.com/status-im/status-mobile/issues/15500") + @marks.xfail(reason="Issue with username in PN, issue #6 in 15500") def test_community_mentions_push_notification(self): self.home_1.navigate_back_to_home_view() + self.device_1.open_notification_bar() self.device_2.just_fyi("Invited member sends a message with a mention") self.channel_2.send_message("hi") @@ -1076,7 +1080,6 @@ def test_community_mentions_push_notification(self): self.channel_2.send_message_button.click() self.device_1.just_fyi("Admin gets push notification with the mention and tap it") - self.device_1.open_notification_bar() message_received = False if self.home_1.get_pn(self.username_1): self.device_1.click_upon_push_notification_by_text(self.username_1) diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py index e144a7bd044..67379ab238f 100644 --- a/test/appium/views/base_view.py +++ b/test/appium/views/base_view.py @@ -386,8 +386,8 @@ def click_system_back_button(self, times=1): def navigate_back_to_home_view(self, attempts=3): counter = 0 - while self.chat_floating_screen.is_element_displayed(2) \ - or self.community_floating_screen.is_element_displayed(2): + while not self.chat_floating_screen.is_element_disappeared(2) \ + or not self.community_floating_screen.is_element_disappeared(2): self.driver.press_keycode(4) element = self.chats_tab while not element.is_element_displayed(1) and counter <= attempts: diff --git a/test/appium/views/chat_view.py b/test/appium/views/chat_view.py index 204e5e6e11e..18db29d14ea 100644 --- a/test/appium/views/chat_view.py +++ b/test/appium/views/chat_view.py @@ -5,7 +5,8 @@ import dateutil.parser from appium.webdriver.common.touch_action import TouchAction -from selenium.common.exceptions import NoSuchElementException, TimeoutException, StaleElementReferenceException +from selenium.common.exceptions import NoSuchElementException, TimeoutException, StaleElementReferenceException, \ + InvalidElementStateException from tests import emojis, common_password from views.base_element import Button, EditBox, Text, BaseElement, SilentButton @@ -334,9 +335,10 @@ def click(self): class UsernameCheckbox(Button): - def __init__(self, driver, username): + def __init__(self, driver, username, state_on): self.username = username - super().__init__(driver, xpath="//*[@text='%s']/..//*[@content-desc='checkbox-off']" % username) + super().__init__(driver, xpath="//*[@text='%s']/..//*[@content-desc='checkbox-%s']" % ( + username, 'on' if state_on else 'off')) def click(self): try: @@ -488,6 +490,7 @@ def share_community(self, community_name, user_names_to_share): self.driver.info("Share to %s community" % ', '.join(map(str, user_names_to_share))) self.jump_to_communities_home() home = self.get_home_view() + home.communities_tab.click() community_element = home.get_chat(community_name, community=True) # community_element.long_press_until_element_is_shown(self.view_members_button) community_element.long_press_until_element_is_shown(self.share_community_button) @@ -941,9 +944,9 @@ def request_membership_for_group_chat(self, intro_message): self.introduce_yourself_edit_box.set_value(intro_message) self.request_membership_button.click_until_presence_of_element(self.element_by_text('Request pending…')) - def get_username_checkbox(self, username: str): + def get_username_checkbox(self, username: str, state_on=False): self.driver.info("Getting %s checkbox" % username) - return UsernameCheckbox(self.driver, username) + return UsernameCheckbox(self.driver, username, state_on) def accept_membership_for_group_chat_via_chat_view(self, username, accept=True): info = "%s membership to group chat" % username @@ -993,13 +996,18 @@ def send_message(self, message: str = 'test message', wait_chat_input_sec=5): try: self.chat_message_input.send_keys(message) break - except StaleElementReferenceException: + except (StaleElementReferenceException, InvalidElementStateException): time.sleep(1) except Exception as e: raise e else: raise StaleElementReferenceException(msg="Can't send keys to chat message input, loading") - self.send_message_button.click() + try: + self.send_message_button.click() + except NoSuchElementException: + self.chat_message_input.clear() + self.chat_message_input.send_keys(message) + self.send_message_button.click() def send_contact_request(self, message: str = 'Contact request message', wait_chat_input_sec=5): self.driver.info("Sending contact request message '%s'" % BaseElement(self.driver).exclude_emoji(message)) @@ -1017,7 +1025,7 @@ def pin_message(self, message, action="pin"): def edit_message_in_chat(self, message_to_edit, message_to_update): self.driver.info("Looking for message '%s' to edit it" % message_to_edit) element = self.element_by_translation_id("edit-message") - self.chat_view_element_starts_with_text(message_to_edit).long_press_until_element_is_shown(element) + self.chat_element_by_text(message_to_edit).message_body.long_press_until_element_is_shown(element) element.click() self.chat_message_input.clear() self.chat_message_input.send_keys(message_to_update) @@ -1025,10 +1033,12 @@ def edit_message_in_chat(self, message_to_edit, message_to_update): def delete_message_in_chat(self, message, everyone=True): self.driver.info("Looking for message '%s' to delete it" % message) - self.chat_view_element_starts_with_text(message).long_press_element() - for_everyone, for_me = self.element_by_translation_id("delete-for-everyone"), self.element_by_translation_id( - "delete-for-me") - for_everyone.click() if everyone else for_me.click() + if everyone: + delete_button = self.element_by_translation_id("delete-for-everyone") + else: + delete_button = self.element_by_translation_id("delete-for-me") + self.chat_element_by_text(message).message_body.long_press_until_element_is_shown(delete_button) + delete_button.click() def copy_message_text(self, message_text): self.driver.info("Copying '%s' message via long press" % message_text) diff --git a/test/appium/views/elements_templates/discovery_general_channel.png b/test/appium/views/elements_templates/discovery_general_channel.png index 3acc32ece710d713b29af3897d2008a0acf109fd..81b1aa15bf96c48a4095c3d4c6813539496ef89e 100644 GIT binary patch delta 1795 zcmV+e2mJVs4wDX$B!AjTL_t(|oZXvUY!p=#$A2?BY|D1penHo;ti?biLaYLziN#7t zAT`DspKLV7ga@BAnh;)$kq6YwWvvS)KtNjn417=pMO*kiGSoZ&vO${kNbQjFwML#bUp#m zX#H4t)x^w<$TkN~0!&kE`$rX%lk+s&Nx;-p?HrqhKsr5dVYdme+}cMSbKG{DfN1p5 zTKMw83f#=XCSWleJf$K_Rv{pfP#4CkM*5GYZX&#Z0%pb49pw2i|`l zhK35a3x#0cKIrRHKc?1JG&2%0mGA$5`~d?4&LG8x4X|;e1T_Er6E0kE8e#kQ!>(Ow z$L0580X*o_b2kLLi++SGxa>joH`BmcbKGsC!m9 zFn>+d>R9%wziL(PHYZNN-o5$nF*sOw+EfU=TF1;ek*!^d6CKKereUD#DBB5ITkY$+ zcXPK{zaHLu&#p%zaO#v@SGf@Cx?%#>uC=f4-IKjO9Co&O?l~zIu3mK#(A=zMYyi5B zu2eNQZ6Mj1mLZ=?E1lj_8y-Lkq8_+X4hYP zP2Jc43zj?sJ-fe!mzi^>{)Y2)I)FXe`dT!7H2_9L@;e-quXdmM;4HdeP=+`TRV=Xte&) zV+;d2I$SmV_`q>){Vj%_24oAjZfz%f-f>!&^BsYvCNUK1DNDrV)EpWf$$tpn-`C65 z?q`U_rx_i)!RfEhFgkXFq2UpFy1O!ca!;t{=K5I>HO=)7b#`zVfS&FyUU~5a+S{55 zhl1?b)=ht3F91WAM;v`}6JQu>{qR!I*yy^c_4a$VbTNKEk}0wHH0#!O0x&vu!_gMq2ZB?@IBpKtXtDbI26RU)H!ux z@oDbepWxTuuQ7C4`h-^oU53S5TV*k-g(eg+e5^&Sr@M4I8dS$lI;{@(b6qrSYoC3F3F z=&?-S(j%fipO~Zz_0d!+m6w3=`?ke8mw*rUA9d6}`}D({_bAV;G7M;M7h9o@+0 zAFe7uWij!lCea9$AAC;E%#;(y(SJ-!$$+aVkZ@;~x0w70L2^63Bo002ovPDHLkV1fbdc2EES delta 1790 zcmVC$5@0d`m6bGW@_^h4U<{a=qQ=>pVh{wtY^IhY5xEiI@c@&PWY5KbC<0YgG$XP^ zb_9e%fZGiO0)JV*IIk!#2dq{y5uMOafY(dP7izj|g&+_KCX>Eyx(JwHdAUy#S z6Eo|}Plwk_I;25r0=(YRU+}bGYAWqVOiqBj&(9XP-G3?F^W+4S;y#}X7)$v<6AAEm zO2@;?CjtS|Z5q@BFh;)pY{lec!pv3^Ff~=Yz@`w0L=qNug#bCMo$Z(wwkrg9JhN-z zO9eS`6NN&+Om=wmB2HH#AQRcQG7^4=S9+z985Y<^i zI9#~tAAb%5|NaYHxdOOcz>61@*R$Dxwl-kXCSc1J-C3Qi5Iv(1nAgj+#?Cq6^=shZ zLBQ!uFK4p>M~(nnxAGrTO$`L*b~En#|D#91u3hRR#j<6o;$b%e1xv`}ZsNZnt{jC?*n zjvf5Q1^|)-QT2s*pu3yCBtWUCojWNYiVuMqBlFm|k0L|>m_J`l9uJh2L13W}!`ruf zUv&RIuzPo6Ftm0pRewEs0^Gc*gym&rz{QKe>eYP5)zA>F4|w;Ee@@`#OW?o(;D6Sw z^m47Oz{!*JR}Tb%$Sf}>0u2TVr~ryG!(sAD0|82g7z{vteUyMgRenSw25gySjkRPJQ)&l0;P@dXp%@AYe2`2?z#ho0@5`SV;LCKwE&(NKDR@%&;WU z_LzstQRQ5q5P7(Kz-R>K&dpodtbam49?MU;L6U&lT4iy|1C%Gp<)@{L>S|rekBqwE z^`%eusog-cnVgkUJR!DNG);T2&yO3ueYoD^iYZ@LYek1+1-5VPOps5k6ZCjWuRKPQ zD4D7OKOH-R;a6{?)~uK`V+<|Ljri`HuhoxEctT|*ISQpzC8E(ZovwZizkedHw(HYQ zbU0SP>+@q^a0q|>a}5K7LvXtK(e7xA^+|3}R%_`jh=QPbhq~VD0syo-+VJ^j8&Fqk zh27SG%^MxD>F@08SM^CwfF$va!}Xw|LbIs+_1o9BVPw=DYhIrpEzOMpfPujwRiD(c zu*pP@QL(E=%F8v0{r6xXc7J{Bw?ER#Uhi>X^F{{%EydEsE|Q)%51B&tKmWdl8`0@6 zWH4P>-A^_+@Z}dXA5*^F(T0}Ajj-DqV49;g9k0)i_oL&u z_uw&{ebi^6twCd2yrza0qhid2433YysI@!Vu=lI&Ddp-w3*xHfEq}3o&c1$)&tL$nEZ6C$@>d%Op zOyrUl>PJ)Ia7qH=m7Gq%_eXwJ-T(f}4@sYqU05YaKwTaA3VDpok|O?aRR@G=EfsRh ziC0$AjNtjh$v_~hTzAFKKYpu8F84zLL7R diff --git a/test/appium/views/home_view.py b/test/appium/views/home_view.py index dbf992d97e4..49cbe2a6d11 100644 --- a/test/appium/views/home_view.py +++ b/test/appium/views/home_view.py @@ -36,7 +36,7 @@ def __init__(self, driver, username_part, community=False, community_channel=Fal if self.community_channel: super().__init__( driver, - xpath="//*[@content-desc='chat-name-text']//*[starts-with(@text,'# %s')]/.." % username_part) + xpath="//*[@content-desc='chat-name-text']//*[starts-with(@text,'# %s')]/../.." % username_part) elif community: super().__init__( driver, @@ -411,7 +411,9 @@ def create_group_chat(self, user_names_to_add: list, group_chat_name: str = 'new self.new_chat_button.click() chat = self.get_chat_view() self.start_a_new_chat_bottom_sheet_button.click() - [chat.get_username_checkbox(user_name).click() for user_name in user_names_to_add] + for user_name in user_names_to_add: + chat.get_username_checkbox(user_name).click_until_presence_of_element( + chat.get_username_checkbox(user_name, state_on=True)) self.setup_chat_button.click() chat.chat_name_editbox.send_keys(group_chat_name) chat.create_button.click()