appium 元素定位

真机调试中,用Appium Inspector定位不到第三方浏览器(火狐浏览器)的元素,怎么获取对应元素xpath

  • 你看下这篇博客吧, 应该有用👉 :appium1.22.x 版本后的 appium inspector 需单独安装
  • 除此之外, 这篇博客: Appium自动化测试<三>中的 xpath :元素功能描述(能不用就不同xpath,效率太低) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 根据id属性定位
    表达式://*[@resource-id='id属性']
    
    根据text属性定位
    表达式://*[@text='text文本属性']
    
    根据class属性定位
    表达式: //*[@class='class属性']
    
    通过content-desc属性定位
    
    表达式: //*[@content-desc='文本']
    driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.launcher3:id/tv_search']").click()
    driver.find_element(AppiumBy.XPATH, "//*[@text='xxxx']").click()
    driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.TextView']").click()
    driver.find_element(AppiumBy.XPATH, "//*[@content-desc='xxxx']").click()
    
    

在使用 Appium Inspector 定位元素时,可能会遇到无法定位到第三方浏览器(如火狐浏览器)中的元素的情况。这是因为 Appium Inspector 默认只支持定位原生应用程序的元素,而不支持定位浏览器中的元素。

如果你想获取第三方浏览器(如火狐浏览器)中的元素的 XPath,你可以尝试以下方法:

  • 使用 Appium Desktop:Appium Desktop 是一个可视化的 Appium 界面工具,可以更灵活地定位元素。你可以使用 Appium Desktop 连接到设备并启动浏览器应用,然后使用其提供的元素定位功能来获取浏览器中元素的 XPath。
  • 使用浏览器开发者工具:打开浏览器中的开发者工具(通常是通过按 F12 键或右键点击页面并选择 "Inspect")并切换到 "Elements" 或类似的选项卡。在开发者工具中,你可以查看网页的 DOM 结构,并通过右键点击元素并选择 "Copy" -> "Copy XPath" 或类似选项来复制元素的 XPath。
  • 使用其他元素定位策略:除了 XPath,还可以使用其他元素定位策略,如 ID、CSS 选择器、类名等。在浏览器开发者工具中,你可以查看元素的其他属性,例如 ID 或类名,然后使用这些属性来定位元素。

需要注意的是,浏览器中的元素可能会动态地改变其属性或结构,因此获取到的 XPath 或其他定位信息可能会随着页面加载或操作的不同而变化。确保在获取元素定位信息后,进行验证并在代码中使用合适的等待策略来保证准确的元素定位。

希望这些方法能帮助你获取第三方浏览器中元素的定位信息。

提供一个测试范例


import unittest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy

capabilities = dict(
    platformName='Android',
    automationName='uiautomator2',
    deviceName='Android',
    appPackage='com.android.settings',
    appActivity='.Settings',
    language='en',
    locale='US'
)

appium_server_url = 'http://localhost:4723'

class TestAppium(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Remote(appium_server_url, capabilities)

    def tearDown(self) -> None:
        if self.driver:
            self.driver.quit()

    def test_find_battery(self) -> None:
        el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]')
        el.click()

if __name__ == '__main__':
    unittest.main()