我试图以与页面无关的方式查找iOS应用程序的标题。该标头在所有页面上均可见,并且始终在以下类链中找到:
header_class_chain = '**/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther'
该类链对深度为14层的XCUIElementTypeOther
类型的所有元素进行全局搜索。我无法通过accessibility_id进行搜索,因为这些标签不存在,我也不希望它们会很快被添加。
在Appium Inspector中,当我使用self.driver.find_element((MobileBy.IOS_CLASS_CHAIN, header_class_chain))
在上述类链上进行搜索时,无论是在直接从应用程序内菜单直接访问的页面上还是在某些子项上,我总是可以找到所需的标题元素页。因此,我认为无论页面内容如何,我都可以使用该类链来查找标头。
但是,当我在自动化条件下运行测试脚本时,在该类链上进行搜索只能在可通过菜单直接访问的页面上找到标题。我希望该类链在自动化下的功能与手动起作用的方式相同,也就是说,它会在任何显示的页面上找到标题。
两个有趣的观察可能会或可能不会有帮助。首先,在应用程序处于给定工作流程中时,Appium报告的标头元素ID不会更改。也就是说,如果我要完成购买工作流程,则Appium中标题的ID保持不变,直到我完成工作流程或通过菜单导航到另一个页面为止。我已经通过Appium Inspector手动以及在自动测试运行的日志中观察到了此行为。
第二,在子页面上搜索标题时,我在Appium日志中看到以下几行:
[WD Proxy] Got response with status 200: "{\n \"value\" : false,\n \"sessionId\" : \"4C72B56A-C6C6-4D9A-850E-3C95EE014E29\",\n \"status\" : 0\n}"
[WD Proxy] Replacing sessionId 4C72B56A-C6C6-4D9A-850E-3C95EE014E29 with 3a91c7cb-d660-48b4-8b2d-144dbaecfaae
当我开始测试时,日志报告[info] [35m[BaseDriver][39m Session created with session id: 3a91c7cb-d660-48b4-8b2d-144dbaecfaae
。
不久之后,另一个sessionId引入了我的测试运行:[debug] [35m[WD Proxy][39m Got response with status 200: {"value":{"sessionId":"4C72B56A-C6C6-4D9A-850E-3C95EE014E29","capabilities":{"device":"iphone","browserName":"APPNAME","sdkVersion":"12.1","CFBundleIdentifier":"com.COMPANY.APPNAME"}},"sessionId":"4C72B56A-C6C6-4D9A-850E-3C95EE014E29","status":0}
(已删除应用名称,因为该应用尚未公开可用。)
我对Appium不够熟悉,无法排除这两个sessionId是导致搜索失败的原因。如果我猜到了,我会说运行该应用程序的基本驱动程序带有以3a91开头的sessionId,并且为WebDriverAgent分配了4C72 sessionID,并且WebDriverAgent以某种方式与基本驱动程序进行了交互。再次,这只是一个有根据的猜测,可能与我的实际问题有关:Appium找不到我明确希望的标头元素。
为什么该调用手动成功,但是在自动化下却失败?
不管我在哪个页面上,如何更改代码以便可以找到标头?
答案 0 :(得分:0)
结果是我在搜索错误的元素。在可从菜单直接访问的页面上,标题是XCUIElementTypeOther
深度的14个级别。在子页面上,页眉深15级。我必须修改搜索以找到在14或15级深处可见的标头。