e2e: appium upgrade
This commit is contained in:
parent
2358eb195b
commit
a416267094
|
@ -1,56 +1,56 @@
|
||||||
|
Appium-Python-Client==2.11.1
|
||||||
|
Pillow==8.1.0
|
||||||
|
PyGithub==1.55
|
||||||
|
PyYAML==5.4
|
||||||
aiohttp==3.8.1
|
aiohttp==3.8.1
|
||||||
allpairspy==2.5.0
|
allpairspy==2.5.0
|
||||||
apipkg==1.5
|
apipkg==1.5
|
||||||
Appium-Python-Client==1.3.0
|
|
||||||
PyGithub==1.55
|
|
||||||
async-timeout==4.0.1
|
async-timeout==4.0.1
|
||||||
certifi==2020.11.8
|
certifi==2023.7.22
|
||||||
chardet==3.0.4
|
chardet==3.0.4
|
||||||
cycler==0.10.0
|
cycler==0.10.0
|
||||||
cytoolz==0.12.0
|
cytoolz==0.12.0
|
||||||
|
docker==4.4.0
|
||||||
emoji==0.5.0
|
emoji==0.5.0
|
||||||
|
eth-account==0.7.0
|
||||||
eth-hash==0.3.2
|
eth-hash==0.3.2
|
||||||
eth-keys
|
eth-keys
|
||||||
execnet==1.7.1
|
execnet==1.7.1
|
||||||
future==0.18.2
|
|
||||||
flaky==3.7.0
|
flaky==3.7.0
|
||||||
|
future==0.18.2
|
||||||
|
hexbytes==0.2.2
|
||||||
idna==2.10
|
idna==2.10
|
||||||
|
imagehash
|
||||||
|
influxdb==5.3.1
|
||||||
kiwisolver==1.3.1
|
kiwisolver==1.3.1
|
||||||
|
lru-dict==1.1.7
|
||||||
lxml==4.6.5
|
lxml==4.6.5
|
||||||
matplotlib==3.3.3
|
matplotlib==3.3.3
|
||||||
multidict==5.0.2
|
multidict==5.0.2
|
||||||
namedlist==1.8
|
namedlist==1.8
|
||||||
numpy==1.23.0
|
numpy==1.23.0
|
||||||
pbkdf2==1.3
|
pbkdf2==1.3
|
||||||
Pillow==8.1.0
|
|
||||||
py==1.10.0
|
|
||||||
py-ecc==6.0.0
|
py-ecc==6.0.0
|
||||||
|
py==1.10.0
|
||||||
pycryptodome==3.9.9
|
pycryptodome==3.9.9
|
||||||
pyethash==0.1.27
|
pyethash==0.1.27
|
||||||
pyparsing==2.4.7
|
pyparsing==2.4.7
|
||||||
pysha3==1.0.2
|
pysha3==1.0.2
|
||||||
pytest==7.2.1
|
|
||||||
pytest-forked==1.3.0
|
pytest-forked==1.3.0
|
||||||
pytest-xdist==3.2.0
|
pytest-xdist==3.2.0
|
||||||
|
pytest==7.2.1
|
||||||
python-dateutil==2.8.1
|
python-dateutil==2.8.1
|
||||||
pytz==2020.4
|
pytz==2020.4
|
||||||
PyYAML==5.4
|
|
||||||
repoze.lru==0.7
|
repoze.lru==0.7
|
||||||
requests==2.25.1
|
requests==2.31.0
|
||||||
rlp==3.0.0
|
rlp==3.0.0
|
||||||
sauceclient==1.0.0
|
sauceclient==1.0.0
|
||||||
|
saucelab-api-client==0.6.2
|
||||||
scrypt==0.8.17
|
scrypt==0.8.17
|
||||||
selenium==3.14.1
|
selenium==4.11.2
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
urllib3==1.26.12
|
urllib3==1.26.12
|
||||||
yarl==1.6.3
|
|
||||||
docker==4.4.0
|
|
||||||
influxdb==5.3.1
|
|
||||||
web3==6.0.0b5
|
web3==6.0.0b5
|
||||||
imagehash
|
|
||||||
hexbytes==0.2.2
|
|
||||||
eth-account==0.7.0
|
|
||||||
lru-dict==1.1.7
|
|
||||||
websockets==10.3
|
|
||||||
websocket-client==1.3.2
|
websocket-client==1.3.2
|
||||||
saucelab-api-client==0.6.2
|
websockets==10.3
|
||||||
|
yarl==1.6.3
|
|
@ -60,25 +60,35 @@ def add_local_devices_to_capabilities():
|
||||||
|
|
||||||
|
|
||||||
def get_capabilities_sauce_lab():
|
def get_capabilities_sauce_lab():
|
||||||
desired_caps = dict()
|
caps = dict()
|
||||||
desired_caps['app'] = 'sauce-storage:' + test_suite_data.apk_name
|
caps['platformName'] = 'Android'
|
||||||
|
caps['idleTimeout'] = 1000
|
||||||
|
caps['appium:app'] = 'sauce-storage:' + test_suite_data.apk_name
|
||||||
|
caps['appium:deviceName'] = 'Android GoogleAPI Emulator'
|
||||||
|
caps['appium:deviceOrientation'] = 'portrait'
|
||||||
|
caps['appium:platformVersion'] = '10.0'
|
||||||
|
caps['appium:automationName'] = 'UiAutomator2'
|
||||||
|
caps['appium:newCommandTimeout'] = 600
|
||||||
|
caps['appium:idleTimeout'] = 1000
|
||||||
|
caps['appium:unicodeKeyboard'] = True
|
||||||
|
caps['appium:automationName'] = 'UiAutomator2'
|
||||||
|
caps['appium:setWebContentDebuggingEnabled'] = True
|
||||||
|
caps['appium:ignoreUnimportantViews'] = False
|
||||||
|
caps['ignoreUnimportantViews'] = False
|
||||||
|
caps['appium:enableNotificationListener'] = True
|
||||||
|
caps['enableNotificationListener'] = True
|
||||||
|
caps['appium:enforceXPath1'] = True
|
||||||
|
caps['enforceXPath1'] = True
|
||||||
|
caps['sauce:options'] = dict()
|
||||||
|
caps['sauce:options']['appiumVersion'] = '2.0.0'
|
||||||
|
caps['sauce:options']['username'] = sauce_username
|
||||||
|
caps['sauce:options']['accessKey'] = sauce_access_key
|
||||||
|
caps['sauce:options']['build'] = pytest_config_global['build']
|
||||||
|
caps['sauce:options']['name'] = test_suite_data.current_test.name
|
||||||
|
caps['sauce:options']['maxDuration'] = 3600
|
||||||
|
caps['sauce:options']['idleTimeout'] = 1000
|
||||||
|
|
||||||
desired_caps['build'] = pytest_config_global['build']
|
return caps
|
||||||
desired_caps['name'] = test_suite_data.current_test.name
|
|
||||||
desired_caps['platformName'] = 'Android'
|
|
||||||
desired_caps['appiumVersion'] = '1.18.1'
|
|
||||||
desired_caps['platformVersion'] = '10.0'
|
|
||||||
desired_caps['deviceName'] = 'Android GoogleAPI Emulator'
|
|
||||||
desired_caps['deviceOrientation'] = "portrait"
|
|
||||||
desired_caps['commandTimeout'] = 600
|
|
||||||
desired_caps['idleTimeout'] = 1000
|
|
||||||
desired_caps['unicodeKeyboard'] = True
|
|
||||||
desired_caps['automationName'] = 'UiAutomator2'
|
|
||||||
desired_caps['setWebContentDebuggingEnabled'] = True
|
|
||||||
desired_caps['ignoreUnimportantViews'] = False
|
|
||||||
desired_caps['enableNotificationListener'] = True
|
|
||||||
desired_caps['maxDuration'] = 3600
|
|
||||||
return desired_caps
|
|
||||||
|
|
||||||
|
|
||||||
def update_capabilities_sauce_lab(new_capabilities: dict):
|
def update_capabilities_sauce_lab(new_capabilities: dict):
|
||||||
|
|
|
@ -226,6 +226,8 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||||
if not reply_element.unread_indicator.is_element_displayed():
|
if not reply_element.unread_indicator.is_element_displayed():
|
||||||
self.errors.append("No unread dot is shown on activity center element!")
|
self.errors.append("No unread dot is shown on activity center element!")
|
||||||
|
|
||||||
|
self.home_2.chats_tab.is_element_displayed() # just saving device 2 session from expiration
|
||||||
|
|
||||||
self.home_1.just_fyi("Swiping to 'Replies' on activity center and check unread there")
|
self.home_1.just_fyi("Swiping to 'Replies' on activity center and check unread there")
|
||||||
self.home_1.mention_activity_tab_button.click()
|
self.home_1.mention_activity_tab_button.click()
|
||||||
if reply_element.is_element_displayed(2):
|
if reply_element.is_element_displayed(2):
|
||||||
|
@ -236,6 +238,8 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||||
if not reply_element.is_element_displayed():
|
if not reply_element.is_element_displayed():
|
||||||
self.errors.append("Filter on replies tab is not working in Activity centre!")
|
self.errors.append("Filter on replies tab is not working in Activity centre!")
|
||||||
|
|
||||||
|
self.home_2.chats_tab.is_element_displayed() # just saving device 2 session from expiration
|
||||||
|
|
||||||
self.home_1.just_fyi("Mark it as read and check filter")
|
self.home_1.just_fyi("Mark it as read and check filter")
|
||||||
reply_element.swipe_right_on_element()
|
reply_element.swipe_right_on_element()
|
||||||
self.home_1.activity_notification_swipe_button.click()
|
self.home_1.activity_notification_swipe_button.click()
|
||||||
|
@ -245,6 +249,8 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||||
if not reply_element.is_element_displayed(2):
|
if not reply_element.is_element_displayed(2):
|
||||||
self.errors.append("Read filter is not displayed read message!")
|
self.errors.append("Read filter is not displayed read message!")
|
||||||
|
|
||||||
|
self.home_2.chats_tab.is_element_displayed() # just saving device 2 session from expiration
|
||||||
|
|
||||||
self.home_1.just_fyi("Mark it as unread and check filter via right swipe")
|
self.home_1.just_fyi("Mark it as unread and check filter via right swipe")
|
||||||
reply_element.swipe_right_on_element()
|
reply_element.swipe_right_on_element()
|
||||||
self.home_1.activity_notification_swipe_button.click()
|
self.home_1.activity_notification_swipe_button.click()
|
||||||
|
@ -260,6 +266,8 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||||
if self.home_1.notifications_unread_badge.is_element_displayed():
|
if self.home_1.notifications_unread_badge.is_element_displayed():
|
||||||
self.errors.append("Notification was not marked as read after opening it in community channel!")
|
self.errors.append("Notification was not marked as read after opening it in community channel!")
|
||||||
|
|
||||||
|
self.home_2.chats_tab.is_element_displayed() # just saving device 2 session from expiration
|
||||||
|
|
||||||
self.home_1.just_fyi("Delete it from unread via left swipe")
|
self.home_1.just_fyi("Delete it from unread via left swipe")
|
||||||
self.home_1.open_activity_center_button.click()
|
self.home_1.open_activity_center_button.click()
|
||||||
reply_element.swipe_left_on_element()
|
reply_element.swipe_left_on_element()
|
||||||
|
@ -323,6 +331,7 @@ class TestActivityMultipleDevicePR(MultipleSharedDeviceTestCase):
|
||||||
self.home_2.clear_chat_long_press(self.username_1)
|
self.home_2.clear_chat_long_press(self.username_1)
|
||||||
|
|
||||||
[home.navigate_back_to_home_view() for home in (self.home_1, self.home_2)]
|
[home.navigate_back_to_home_view() for home in (self.home_1, self.home_2)]
|
||||||
|
|
||||||
self.home_1.just_fyi("Open community to message")
|
self.home_1.just_fyi("Open community to message")
|
||||||
self.home_1.communities_tab.click()
|
self.home_1.communities_tab.click()
|
||||||
community_name = 'closed community'
|
community_name = 'closed community'
|
||||||
|
|
|
@ -9,8 +9,7 @@ import imagehash
|
||||||
from PIL import Image, ImageChops, ImageStat
|
from PIL import Image, ImageChops, ImageStat
|
||||||
from appium.webdriver.common.mobileby import MobileBy
|
from appium.webdriver.common.mobileby import MobileBy
|
||||||
from appium.webdriver.common.touch_action import TouchAction
|
from appium.webdriver.common.touch_action import TouchAction
|
||||||
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException
|
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException, TimeoutException
|
||||||
from selenium.common.exceptions import TimeoutException
|
|
||||||
from selenium.webdriver.support import expected_conditions
|
from selenium.webdriver.support import expected_conditions
|
||||||
from selenium.webdriver.support.wait import WebDriverWait
|
from selenium.webdriver.support.wait import WebDriverWait
|
||||||
|
|
||||||
|
@ -81,8 +80,8 @@ class BaseElement(object):
|
||||||
"Device %s: %s by %s: `%s` is not found on the screen" % (
|
"Device %s: %s by %s: `%s` is not found on the screen" % (
|
||||||
self.driver.number, self.name, self.by, self.locator)) from None
|
self.driver.number, self.name, self.by, self.locator)) from None
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
if 'Internal Server Error' in str(exception):
|
# if 'Internal Server Error' in str(exception):
|
||||||
continue
|
raise exception
|
||||||
|
|
||||||
def find_elements(self):
|
def find_elements(self):
|
||||||
return self.driver.find_elements(self.by, self.locator)
|
return self.driver.find_elements(self.by, self.locator)
|
||||||
|
@ -150,22 +149,45 @@ class BaseElement(object):
|
||||||
"Device %s: %s by %s: `%s` is still visible on the screen after %s seconds after wait_for_invisibility_of_element" % (
|
"Device %s: %s by %s: `%s` is still visible on the screen after %s seconds after wait_for_invisibility_of_element" % (
|
||||||
self.driver.number, self.name, self.by, self.locator, seconds)) from None
|
self.driver.number, self.name, self.by, self.locator, seconds)) from None
|
||||||
|
|
||||||
|
def wait_for_staleness_of_element(self, seconds=10):
|
||||||
|
try:
|
||||||
|
return WebDriverWait(self.driver, seconds).until(expected_conditions.staleness_of(self.find_element()))
|
||||||
|
except TimeoutException:
|
||||||
|
raise TimeoutException(
|
||||||
|
"Device %s: %s by %s: `%s` is not stale after %s seconds" % (
|
||||||
|
self.driver.number, self.name, self.by, self.locator, seconds)) from None
|
||||||
|
|
||||||
|
def wait_for_rendering_ended_and_click(self, attempts=3):
|
||||||
|
for i in range(attempts):
|
||||||
|
try:
|
||||||
|
self.click()
|
||||||
|
self.driver.info("Attempt %s is successful clicking %s" % (i, self.locator))
|
||||||
|
return
|
||||||
|
except StaleElementReferenceException:
|
||||||
|
time.sleep(1)
|
||||||
|
raise StaleElementReferenceException(
|
||||||
|
msg="Device %s: continuous rendering, can't click an element by %s: %s" % (
|
||||||
|
self.driver.number, self.by, self.locator))
|
||||||
|
|
||||||
def wait_for_element_text(self, text, wait_time=30, message=None):
|
def wait_for_element_text(self, text, wait_time=30, message=None):
|
||||||
counter = 0
|
if not isinstance(text, str):
|
||||||
|
text = str(text)
|
||||||
self.driver.info("Wait for text element `%s` to be equal to `%s`" % (self.name, text))
|
self.driver.info("Wait for text element `%s` to be equal to `%s`" % (self.name, text))
|
||||||
while True:
|
element_text = str()
|
||||||
text_element = self.find_element().text
|
counter = 0
|
||||||
if isinstance(text, int):
|
while counter < wait_time:
|
||||||
text_element = int(text_element.strip())
|
try:
|
||||||
if counter >= wait_time:
|
element_text = self.find_element().text.strip()
|
||||||
self.driver.fail(message if message else "`%s` is not equal to expected `%s` in %s sec" % (
|
except StaleElementReferenceException:
|
||||||
text_element, text, wait_time))
|
time.sleep(1)
|
||||||
elif text_element != text:
|
element_text = self.find_element().text.strip()
|
||||||
counter += 10
|
if element_text == text:
|
||||||
time.sleep(10)
|
|
||||||
else:
|
|
||||||
self.driver.info('Element %s text is equal to %s' % (self.name, text))
|
self.driver.info('Element %s text is equal to %s' % (self.name, text))
|
||||||
return
|
return
|
||||||
|
counter += 10
|
||||||
|
time.sleep(10)
|
||||||
|
self.driver.fail(message if message else "`%s` is not equal to expected `%s` in %s sec" % (
|
||||||
|
element_text, text, wait_time))
|
||||||
|
|
||||||
def scroll_to_element(self, depth: int = 9, direction='down'):
|
def scroll_to_element(self, depth: int = 9, direction='down'):
|
||||||
self.driver.info('Scrolling %s to %s' % (direction, self.name))
|
self.driver.info('Scrolling %s to %s' % (direction, self.name))
|
||||||
|
|
|
@ -149,13 +149,10 @@ class ActivityCenterElement(SilentButton):
|
||||||
return Button(self.driver, xpath=self.locator + '//*[@content-desc="activity-message-body"]')
|
return Button(self.driver, xpath=self.locator + '//*[@content-desc="activity-message-body"]')
|
||||||
|
|
||||||
def handle_cr(self, element_accessibility: str):
|
def handle_cr(self, element_accessibility: str):
|
||||||
try:
|
Button(
|
||||||
accept_element = Button(self.driver,
|
self.driver,
|
||||||
xpath=self.locator + '/*[@content-desc="%s"]' % element_accessibility).find_element()
|
xpath=self.locator + '/*[@content-desc="%s"]' % element_accessibility
|
||||||
except NoSuchElementException:
|
).wait_for_rendering_ended_and_click()
|
||||||
return ''
|
|
||||||
if accept_element:
|
|
||||||
accept_element.click()
|
|
||||||
|
|
||||||
def accept_contact_request(self):
|
def accept_contact_request(self):
|
||||||
self.handle_cr("accept-contact-request")
|
self.handle_cr("accept-contact-request")
|
||||||
|
@ -383,7 +380,7 @@ class HomeView(BaseView):
|
||||||
chat_element.cancel_contact_request()
|
chat_element.cancel_contact_request()
|
||||||
else:
|
else:
|
||||||
self.driver.fail("Illegal option for CR!")
|
self.driver.fail("Illegal option for CR!")
|
||||||
self.close_activity_centre.click()
|
self.close_activity_centre.wait_for_rendering_ended_and_click()
|
||||||
self.chats_tab.wait_for_visibility_of_element()
|
self.chats_tab.wait_for_visibility_of_element()
|
||||||
|
|
||||||
def get_username_below_start_new_chat_button(self, username_part):
|
def get_username_below_start_new_chat_button(self, username_part):
|
||||||
|
|
Loading…
Reference in New Issue