Как использовать элемент «ждать до» перед отображением определенной страницы? (используя Python 3.7) - PullRequest
1 голос
/ 04 октября 2019

Прежде всего, я новичок в тестировании приложения с использованием appium (python 3.7). Здесь я тестирую приложение, в котором мне нужно ждать сразу после завершения входа в систему. Я сделал это с помощью неявного ожидания. Но теперь, чтобы сделать процесс тестирования более динамичным, я хочу подождать, пока не отобразится следующая страница.

Примечание: Я видел и пробовал несколько вопросов на этом форуме, но не мог с собой поделать.

Вот код:

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

    desired_cap = {
        "platformName": "Android",
        "deviceName": "QDG9X18426W11577",
        "newCommandTimeout": "240",
        "app": "C:\\Users\\tahmina\\Downloads\\test-v3.10.apk",
        "appPackage": "com.cloudapper.android",
        "appActivity": "com.cloudapper.android.SplashActivity"
    }

#Making connection with Appium server

driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_cap)

#Here i have used implicit wait to load the login page

driver.implicitly_wait(20)

#Login to the app

        search_element = driver.find_element_by_id('Username').send_keys('test@yandex.com')

        search_element = driver.find_element_by_id('Password').send_keys('1155qQQ')

        search_element = driver.find_element_by_xpath(
            '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View[2]/android.widget.Button').click()

    wait = WebDriverWait(driver, 10)

#Waiting until the next process comes up
if webdriver.wait.until(driver.find_element_by_id('com.cloudapper.android:id/item_bg').is_displayed()):
    print('Run the next process')
elif webdriver.wait.until(not driver.find_element_by_id('com.cloudapper.android:id/item_bg')):
    print('Something went wrong!')

#Searching employee by using ID
search_element = driver.find_element_by_id('com.cloudapper.android:id/edtSearch').send_keys('1018')
driver.execute_script('mobile:performEditorAction', {'action': 'search'})

Покажите мне, если у кого-то из вас есть какое-либо решение по этому поводу.

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

В Python вы можете использовать WebDriverWait и ExpectedConditions для решения вашей проблемы.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#Login to the app

search_element = driver.find_element_by_id('Username').send_keys('test@yandex.com')

search_element = driver.find_element_by_id('Password').send_keys('1155qQQ')

search_element = driver.find_element_by_xpath(
            '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View[2]/android.widget.Button').click()

# Waiting until the next process comes up
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "com.cloudapper.android:id/item_bg")))

Если вы хотите реализовать WebDriverWait в блоке try / except,Вы можете справиться со случаем, когда нужный элемент не появляется на странице:

from selenium.common.exceptions import TimeoutException


# Waiting until the next process comes up
try:
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "com.cloudapper.android:id/item_bg")))
except TimeoutException as ex:
    # handle the exception here
    print("Exception has been thrown. " + str(ex))

Поскольку вы используете явное ключевое слово wait.until, вам не следует устанавливать драйвер Implicit wait. Неправильно устанавливать неявное и явное ожидание в ваших тестах автоматизации и может привести к неожиданному времени ожидания.

Еще одно замечание - я заметил, что вы используете явную запись XPath в некоторых ваших селекторах. XPath - отличный метод для выбора элементов, но использование явных селекторов как таковых делает ваш код очень хрупким. Я рекомендую использовать относительные селекторы вместо этого. Вы можете заменить это:

search_element = driver.find_element_by_xpath(
            '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View[2]/android.widget.Button').click()

этим:

search_element = driver.find_element_by_xpath('//android.widget.Button').click()

Возможно, вам придется запросить дополнительные атрибуты, такие как текст -

search_element = driver.find_element_by_xpath('//android.widget.Button[@text='Log in']').click()

В целом,этот метод гораздо эффективнее.

0 голосов
/ 10 октября 2019

Это для тех, кто сталкивается с той же проблемой:

  1. Импорт WebDriverWait и Ожидаемые условия
  2. Используйте это как явное ожидание вваш код WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "com.cloudapper.android:id/item_bg")))
0 голосов
/ 04 октября 2019

Вы пробовали что-то вроде этого:

import time
time.sleep(0.5)
...