Appium UI导航问题 Python脚本

0 投票
2 回答
609 浏览
提问于 2025-04-18 10:23

我刚开始学习用Python做安卓开发。我需要写一个Python脚本。简单来说,我想实现的是:当你点击第一个界面时,应该加载第二个界面。第二个界面上有一个按钮,当你按下这个按钮时,我需要加载第三个界面。

class SimpleAndroidTests(unittest.TestCase):
def setUp(self):
    desired_caps = {}
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = '4.2'
    desired_caps['deviceName'] = 'Android Emulator'
    desired_caps['app'] = PATH(
        'mypath/aaa.apk'
    )
    desired_caps['appPackage'] = 'com.xxxx'

    self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

def test_find_elementsFirstview(self):
    time.sleep(13)
    textfields = self.driver.find_elements_by_class_name("android.widget.EditText")
    textfields[0].send_keys("first text")
    textfields[1].send_keys("second text")

    el = self.driver.find_element_by_name("press Login")
    el.click()

def test_secondView(self):
  time.sleep(10)
  textfields = self.driver.find_elements_by_class_name("android.widget.EditText")
  textfields[2].send_keys("secondviewinput2")

def tearDown(self):
     # end the session
     self.driver.quit()

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

问题是,它没有进入第二个界面,而是又重新加载了第一个界面。请帮帮我...

2 个回答

0

当你在安卓应用上用 appium 的 Python 脚本点击一个元素时,appium 并不能控制接下来会发生什么。这是应用程序自己来处理这个点击事件。举个例子,如果有一个 登录 按钮,当你执行以下操作:

el = self.driver.find_element_by_name("press Login")
el.click()

这个点击事件是由应用程序来处理的,应用程序会接管后续的流程。比如,它可能会打开一个新的页面,里面有一个表单。

简单来说,appium 的 Python 客户端可以选择哪个界面元素,但这个元素具体会做什么,还是要看应用程序的设计。

2

在你的代码中,有一个方法叫做 setUp(self),nose 工具把它当作“测试准备”方法,这意味着它会在每个测试之前运行。因为你的 setUp() 方法会创建一个 webdriver,所以它在每个测试之前都会重新加载你的应用。你可以考虑把创建驱动的代码放到 setUpClass() 方法里,这样 nose 工具会在文件中的所有测试之前运行这个方法。

示例测试文件:

class YourTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        [...runs before all tests...]

    def setUp(self):
        [...runs before each test...]

    def test_test1(self):
        [...your tests...]

    def tearDown(self):
        [...runs after each test...]

    @classmethod
    def tearDownClass(cls):
        [...runs after all tests...]

撰写回答