В 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()
В целом,этот метод гораздо эффективнее.