使用 Appium 和 Python 测试 iOS 应用程序时等待元素加载?

Posted

技术标签:

【中文标题】使用 Appium 和 Python 测试 iOS 应用程序时等待元素加载?【英文标题】:Wait for element to load when testing an iOS app using Appium and Python? 【发布时间】:2014-08-03 11:54:44 【问题描述】:

我正在测试一个原生 ios 应用程序,需要等待一些元素在我的一些测试中加载。 Appium 现在在某些屏幕上的速度太快了。

有人可以指点我一个使用 WebDriverWait 样式等待 Appium iOS 测试的示例吗?这里有一个针对 Ruby 的问题:Wait for element to load when testing an iOS app using Appium and Ruby?。在 Python 中寻找类似的东西。

Python 客户端文档似乎没有记录等待函数。

谢谢。

【问题讨论】:

【参考方案1】:

在测试的顶部导入这些。

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

TL/DR 这应该可以工作,您可能需要将 self.driver 更改为 wait = 部分中的驱动程序,具体取决于您的操作方式。此外,显然将 By.XPath 更改为您正在使用的任何定位器:

wait = WebDriverWait(self.driver, 20)
currently_waiting_for = wait.until(EC.element_to_be_clickable((By.XPATH,'//UIAApplication[1]/UIAWindow[1]/UIAButton[@text="example text"]')))

或者您可以告诉驱动程序使用隐式等待。

self.driver.implicitly_wait(10)
myElement = driver.find_element_by_id("fakeid")
myElement.click()

大部分都解释了here。

这是一个使用默认帐户选择器等待登录 android 应用程序的示例(在 ios 上没有使用过,但应该是类似的),然后断言正确的文本出现。在设置过程中,我正在从另一个文件加载我想要的功能。

class TrainUpSmokeTests(unittest.TestCase): 
    def setUp(self):
         desired_caps = desired_capabilities.get_desired_capabilities('app-debug.apk')
         self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def tearDown(self):
        self.driver.quit()

    def example_test(self):
        wd = self.driver

        ## Depending on how you're running the test the first variable may just be driver. Or in my case self.driver which I shortened above. The number is how many seconds it should wait before timing out. 
        wait = WebDriverWait(wd, 20)
        ## Waiting for account selector to be clickable.
        currently_waiting_for = wait.until(EC.element_to_be_clickable((By.XPATH,'//android.widget.CheckedTextView[@text="FakeEmail@example.com"]')))

        ## Locating test account and selecting it.
        account = wd.find_element_by_android_uiautomator('text("FakeEmail@example.com")')
        account.click()
        ok_button = wd.find_element_by_android_uiautomator('text("OK")')
        ok_button.click()

        ## Waiting for an Element on the home screen to be locatable.
        currently_waiting_for = wait.until(EC.presence_of_element_located((By.XPATH,'//android.widget.RelativeLayout[@resource-id="com.name.app:id/overview"]')))
        hero_headline = wd.find_element_by_android_uiautomator('new UiSelector().description("Example Header")')
        self.assertIsNotNone(hero_headline)

if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TrainUpSmokeTests)
unittest.TextTestRunner(verbosity=2).run(suite)

这是一个使用 appium(而不是应用程序)的网站测试。更改设置,让 self.driver 打开浏览器。

 self.driver = webdriver.Firefox()

然后使用 By 选择器,例如类、名称、id,例如下面的例子。

currently_waiting_for = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'search-results')))

这个article 也有帮助。此外,如果您不知道如何找到 xpath,请查看设置 appium 附带的 uiautomatorviewer。

【讨论】:

【参考方案2】:

python的用法是:

driver.implicitly_wait(timeToWaitSec)

Selenium sourcecode(Py)

【讨论】:

【参考方案3】:

你可以使用 WaitForElement 类:

class WaitForElement:
    @staticmethod
    def wait(driver, id, time_out=100):
        try:
            WebDriverWait(driver, time_out).until(
                lambda driver: driver.find_element(*id))
        except TimeoutException:
            print('Not able to find ID:' + id)

【讨论】:

【参考方案4】:

你可以在selenium.webdriver.support.expected_conditions找到你需要的一切

然后你可以这样做:

def wait_for_element_visible(self, by=By.XPATH, value=None, text=None, wait_time=20):
    if text is not None:
        value = value % text
    wait = WebDriverWait(self.driver, wait_time)
    return wait.until(EC.visibility_of_element_located((by, value)))

【讨论】:

【参考方案5】:

您可以使用隐式等待。 remoteWebDriver.implicitlyWait(time, timeUnit) 之类的东西当然是针对 java 的。 python应该有类似的东西。

【讨论】:

以上是关于使用 Appium 和 Python 测试 iOS 应用程序时等待元素加载?的主要内容,如果未能解决你的问题,请参考以下文章

测试新人如何使用Python代码封装自动化测试的用例?

appium+python+jenkins ios测试

python怎么安装nose

Appium python自动化测试系列之appium环境搭建

Appium Python 二:理论概念理解

App自动化测试探索MAC环境搭建iOS+Python+Appium测试环境