Убедитесь, что элемент больше не существует, используя полный путь не-XPath, прежде чем продолжить - PullRequest
0 голосов
/ 01 мая 2019

Я провожу некоторое тестирование настольных приложений, используя Winium с Python.Для моего приложения я сначала подтверждаю, что в окнах отображается индикатор выполнения с другим текстом.Затем я подтверждаю, что индикатор выполнения больше не существует, прежде чем продолжить.

running_app = driver.find_element_by_name("MyApp")
status_bar = running_app.find_element_by_id("statusStrip1")
status_bar.find_element_by_class_name("WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1")
status_bar.find_element_by_name("Loading Default Files...")

# Confirm Progress Bar disappears before continuing
WebDriverWait(driver, 60).until_not(
     expected_conditions.presence_of_element_located((eval("By.CLASS_NAME"), "WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1"))
)

Проблема, с которой я столкнулся, связана с той частью кода, которая предназначена для проверки того, что индикатор выполнения исчез, прежде чем продолжить.Эта конкретная строка занимает слишком много времени для выполнения.После некоторого исследования я пришел к выводу, что это происходит, потому что я могу только передать адрес компонента в «sence_of_element_located », а не его полный адрес, который будет выглядеть примерно так ...

driver.find_element_by_name("MyApp").find_element_by_id("statusStrip1").find_element_by_class_name("WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1")

К сожалению,У меня нет способа разбить это на XPath и использовать вместо этого.Насколько я знаю, я не знаю способа получения XPath объекта, используя этот адрес.Я хотел бы найти способ сделать либо .. (1) Вставить этот абсолютный / полный адрес в Ожидаемые_условия.presence_of_element_located (), либо найти альтернативный способ подтвердить, что объект больше не существует.

- ОБНОВЛЕНИЕ 20190502 -

Пока что самое близкое решение, которое я нашел, - это объединить идеи, приведенные ниже:

WebDriverWait(driver, 15).until(
    expected_conditions.invisibility_of_element_located((eval("By.XPATH"), "//*[@name='MyApp']//*[@id='statusStrip1']//*[@class='WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1']"))
)

Это действительно помогает мне пройти проверку индикатора выполнения.исчез, поэтому тест можно продолжить.Он также имеет ту же проблему синхронизации, что и подстановочные знаки, означающие, что объект должен быть найден первым.

- 20190502 ОБНОВЛЕНИЕ (2) -

Итак, у меня былнемного прорыва, чтобы выяснить эту загадку.Для использования XPath, если я проводил тестирование веб-интерфейса, я могу посмотреть на код XML и увидеть, что это «// div», «// table», «// input», «// tspn» и т. Д.Я использовал инструмент UISpy, чтобы выяснить имена объектов в моем настольном приложении.Когда я смотрел на него, мне стало интересно, какие надписи находятся перед объектом, на который он ссылается.

enter image description here

В контрольном виде я вижу 'MyApp "имеет ярлык" Окно "рядом с ним.Поэтому я решил использовать это, чтобы изменить мою попытку XPath следующим образом:

WebDriverWait(driver, 15).until(
    expected_conditions.invisibility_of_element_located((eval("By.XPATH"), "//window[@name='MyApp']//*[@id='statusStrip1']//*[@class='WindowsForms10.msctls_progress32.app.0.141b42a_r9_ad1']"))
)

Мало того, что это работало, но это было немного быстрее, чем предыдущие попытки.Проблема в том, что следующий слой помечен как «Строка состояния», и я не совсем уверен, как представить это в XPath.

1 Ответ

0 голосов
/ 02 мая 2019

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

Вы можете попробовать использовать элемент:

WebDriverWait(driver, 10).until(EC.invisibility_of_element(progressbar))

здесь я передал веб-элемент условию. progressbar является элементом индикатора выполнения.

Или вы можете передать стратегию локатора и локатор непосредственно в условие:

locator = (By.LOCATOR_STRATEGY, "locator")
WebDriverWait(driver, 10).until(EC.invisibility_of_element_located(locator))

здесь, в locator вам необходимо указать стратегию локатора и индикатор выполнения

Чтобы использовать ожидания, вы должны импортировать следующее:

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