.

Appiumで特定のelementが表示されるまで待つ

必要な背景

以下のようなケースで役に立ちます

  • (特にAndroid) 端末の動作が遅い時などに画面遷移で時間がかかるとき
  • ネットワークの状態によって待ちが発生するとき

Azure pipeline上のAndroid emulatorでAppiumを動作させるときに活躍しました

Sample code

以前自身で作成したコードです (contribution)
https://github.com/appium/python-client/blob/master/test/functional/test_helper.py

test_helper.pylink
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
def wait_for_element(driver: 'WebDriver', locator: str, value: str, timeout_sec: float = 10) -> 'WebElement':
"""Wait until the element located

Args:
driver: WebDriver instance
locator: Locator like WebDriver, Mobile JSON Wire Protocol
(e.g. `appium.webdriver.common.mobileby.MobileBy.ACCESSIBILITY_ID`)
value: Query value to locator
timeout_sec: Maximum time to wait the element. If time is over, `TimeoutException` is thrown

Raises:
`selenium.common.exceptions.TimeoutException`

Returns:
The found WebElement
"""
return WebDriverWait(driver, timeout_sec).until(EC.presence_of_element_located((locator, value)))

上記の wait_for_element が定義されている状態で, 以下のコードで動作します

1
2
# 'Bouncing Balls' というテキストを持つelementを 10 秒のタイムアウトで待つ処理. 返り値は検出したelement.
el = wait_for_element(self.driver, MobileBy.ACCESSIBILITY_ID, 'Bouncing Balls')