当前位置: 首页 > 知识库问答 >
问题:

Appium-无法在选项卡栏控制器中查看视图中的元素

杨安歌
2023-03-14

[上下文]
Appium 1.6.5
XCode 8.3.3
iOS 10.3
Python 2.7

我正在用一个基本的iOS应用程序对Appium进行实验,这个应用程序是通过XCode模板创建的,它创建了一个选项卡应用程序。我的应用程序是根据这个模板创建的,它基本上有一个预先设置了2个标签的标签栏控制器。每个选项卡显示不同的视图。每个视图有两个标签,上面有一些文本。

[Goal]
我想编写一个Appium脚本,该脚本导航到一个特定的选项卡,然后读取其中一个标签的文本。

    <?xml version="1.0" encoding="UTF-8"?><AppiumAUT><XCUIElementTypeApplication type="XCUIElementTypeApplication" name="MyTestApp" label="MyTestApp" enabled="true" visible="true" x="0" y="0" width="375" height="667">
      <XCUIElementTypeWindow type="XCUIElementTypeWindow" enabled="true" visible="true" x="0" y="0" width="375" height="667">
        <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="0" width="375" height="667">
          <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="0" width="375" height="667">
            <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="0" width="375" height="667">
              <XCUIElementTypeOther type="XCUIElementTypeOther" name="view1" enabled="true" visible="true" x="0" y="0" width="375" height="667"/>
            </XCUIElementTypeOther>
          </XCUIElementTypeOther>
          <XCUIElementTypeTabBar type="XCUIElementTypeTabBar" enabled="true" visible="true" x="0" y="618" width="375" height="49"/>
        </XCUIElementTypeOther>
      </XCUIElementTypeWindow>
      <XCUIElementTypeWindow type="XCUIElementTypeWindow" enabled="true" visible="false" x="0" y="0" width="375" height="667">
        <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="false" x="0" y="0" width="375" height="667"/>
      </XCUIElementTypeWindow>
      <XCUIElementTypeWindow type="XCUIElementTypeWindow" enabled="true" visible="true" x="0" y="0" width="375" height="667">
        <XCUIElementTypeStatusBar type="XCUIElementTypeStatusBar" enabled="true" visible="true" x="0" y="0" width="375" height="20">
          <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="false" x="0" y="0" width="375" height="20"/>
          <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="0" y="0" width="375" height="20">
            <XCUIElementTypeOther type="XCUIElementTypeOther" enabled="true" visible="true" x="6" y="0" width="39" height="20"/>
            <XCUIElementTypeOther type="XCUIElementTypeOther" value="SSID" name="3 of 3 Wi-Fi bars" label="3 of 3 Wi-Fi bars" enabled="true" visible="true" x="50" y="0" width="13" height="20"/>
            <XCUIElementTypeOther type="XCUIElementTypeOther" name="10:35 AM" label="10:35 AM" enabled="true" visible="true" x="161" y="0" width="56" height="20"/>
            <XCUIElementTypeOther type="XCUIElementTypeOther" name="-100% battery power" label="-100% battery power" enabled="true" visible="true" x="337" y="0" width="33" height="20"/>
          </XCUIElementTypeOther>
        </XCUIElementTypeStatusBar>
      </XCUIElementTypeWindow>
    </XCUIElementTypeApplication></AppiumAUT>
<XCUIElementTypeOther type="XCUIElementTypeOther" name="view1" enabled="true" visible="true" x="0" y="0" width="375" height="667"/>
driver = webdriver.Remote(get_appium_server(), desired_capabilities=get_capabilities())
driver.find_element_by_id('view1')       # This works fine
driver.find_element_by_id('view1label1') # The code fails here despite the fact that this accessibility ID exists for one of the labels underneath 'view1'
Traceback (most recent call last):
  File "/some_path/Appium.py", line 33, in <module>
    mypythonappiumfunction()
  File "/some_path/Appium.py", line 28, in mypythonappiumfunction
    driver.find_element_by_id('view1label1') # The code fails here despite the fact that this accessibility ID exists for one of the labels underneath 'view1'
  File "/some_path/robot/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 289, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/some_path/robot/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 791, in find_element
    'value': value})['value']
  File "/some_path/robot/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute
    self.error_handler.check_response(response)
  File "/some_path/robot/lib/python2.7/site-packages/appium/webdriver/errorhandler.py", line 29, in check_response
    raise wde
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.`

共有1个答案

曹旭
2023-03-14

我终于弄清楚了这一点,并找到了为什么我的视图中包含的元素是不可见/不可访问的。问题是我启用了包括视图本身在内的所有内容的“可访问性”。

当您使视图可访问时,它将视图视为您可以访问的单个大容器,但随后您将失去对该视图中包含的元素的访问权。

通过简单地禁用视图的“可访问性”(取消XCode中的复选框),我开始看到该视图中包含的元素。

 类似资料:
  • 我正在尝试在我的应用程序中设置Firebase云消息。我在Firebase控制台中创建了该项目(我创建了一个新项目,没有导入以前创建的gcm项目)。我能够成功地设置项目,并在应用程序中运行它,并从firebase控制台的“通知”选项卡接收示例通知。 当试图通过APIhttps://fcm.googleapis.com/fcm/send发送数据消息时,我得到了未经授权的(401)响应。原来我使用了g

  • 我正在学习使用MarkLogic,浏览教程等。我收到一条我不明白的错误消息。当我在查询控制台中需要创建一个新选项卡时,我单击现有选项卡行右端的加号,我收到以下错误消息而不是新选项卡: 这最近奏效了,但现在不行了。

  • 在iOS中,将嵌套视图控制器的视图放在UIViewController的视图中通常是一种糟糕的编程实践吗?比如说,我想有一种互动元素来响应用户的触摸,但只占屏幕的25%。 我想我会将这个嵌套视图控制器添加到UIViewController中,方法如下:

  • 我有一个表,显示Laravel的@Foreach循环的数据。该循环被限制为3。但是我想在表内的图标被限制为2只。这是上菜时的界面: 刀片: 那是我想限制的元素。我通过控制器创建它。像这样: 那么,如何限制表中的图标仅显示2,而表中的数据最多显示3?我一直在寻找这个问题,但仍然没有找到它。我希望你们能帮助我,伙计们。先谢谢你。

  • 我的故事板是这样安排的。 红色:搜索到... 橙色:嵌入了... 绿色:视图控制器的导航控制器 我想让我的中间选项卡视图(绿色)呈现自己的模式,有点像reddit应用程序如何做它的中间‘张贴到reddit’按钮。当这个中间视图被取消时,将返回到先前打开的原始选项卡。如何才能做到这一点呢?

  • 我正在编写一个具有多个视图的iOS应用程序。我已经将应用程序设置为使用基于ViewController的状态栏样式,这允许我使用以下代码 这就像预期的那样。 然后我将视图嵌入到导航控制器中,并将Barbuttonite与showSegue连接起来。此后,视图的ViewController切换为忽略样式设置,并显示默认的黑色状态栏。