在 Python appium 中返回 self.find_element (by = By.ID, value = id_) 和异常错误

Posted

技术标签:

【中文标题】在 Python appium 中返回 self.find_element (by = By.ID, value = id_) 和异常错误【英文标题】:return self.find_element (by = By.ID, value = id_) and exception errors in Python appium 【发布时间】:2019-12-30 13:49:27 【问题描述】:

我想用 python 编写自动化测试。我正在使用 android studio 模拟器和 appium。我想为计算器编写自动化程序,但某处出现了错误。

我添加了 time.sleep() 但问题仍然存在。

from appium import webdriver

import time

caps = "deviceName": "emulator-5554", "platformName": "android", "appPackage": "com.android.calculator2",
        "appActivity": ".Calculator", "noReset": True

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)

el2 = driver.find_element_by_id("com.android.calculator2:id/digit_8")

el2.click()

time.sleep(2)

el3 = driver.find_element_by_accessibility_id("times")

el3.click()

time.sleep(2)

el4 = driver.find_element_by_id("com.android.calculator2:id/digit_3")

el4.click()

time.sleep(2)

el5 = driver.find_element_by_accessibility_id("equals")

el5.click()

time.sleep(2)

el6 = driver.find_element_by_id("com.android.calculator2:id/formula")

el6.click()

time.sleep(2)

driver.quit()

我正在等待安卓模拟器打开计算。

我有这个错误行;

> C:\python37\dersler1\venv\Scripts\python.exe
> C:/python37/dersler1/hs.py Traceback (most recent call last):   File
> "C:/python37/dersler1/hs.py", line 12, in <module>
>     el2 = driver.find_element_by_id("com.android.calculator2:id/digit_8")   File
> "C:\python37\dersler1\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py",
> line 360, in find_element_by_id
>     return self.find_element(by=By.ID, value=id_)   File "C:\python37\dersler1\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py",
> line 978, in find_element
>     'value': value)['value']   File "C:\python37\dersler1\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py",
> line 321, in execute
>     self.error_handler.check_response(response)   File "C:\python37\dersler1\venv\lib\site-packages\appium\webdriver\errorhandler.py",
> line 29, in check_response
>     raise wde   File "C:\python37\dersler1\venv\lib\site-packages\appium\webdriver\errorhandler.py",
> line 24, in check_response
>     super(MobileErrorHandler, self).check_response(response)   File "C:\python37\dersler1\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py",
> line 242, in check_response
>     raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidSelectorException: Message: Locator
> Strategy 'css selector' is not supported for this session

【问题讨论】:

Locator Strategy 'css selector' is not supported for this session issue with appium的可能重复 【参考方案1】:

@adem 我认为您的Appium-Python-Client 版本已经过时,并且与您当前的Appium server 版本不兼容。 使用命令 sudo pip install Appium-Python-Client==0.34

更新您的 Appium-Python-Client

我以前也遇到过同样的问题。正如我所见,您没有在脚本中的任何地方使用 css_selector,但它仍然显示 css_selector 的错误。当您签入您的Appium logs 时,您会对此有更多了解。

对我来说,当我将 Appium-Python-Client 版本更新到 0.34

时,它就解决了

【讨论】:

感谢 Sachhya 提供此信息。我认为我的版本是最新的。 id好像有问题。 Xpath 帮我解决了这个问题。我现在通常更喜欢 appium 中的“xpath”。因为有时accessibility_id 或by_id 不能给出完整的结果。你觉得这个话题怎么样? 我不这么认为,如果资源 ID 存在,那么它一定是可访问的。 还有一件事是你得到了与 css_ 选择器相关的错误,该选择器在你的脚本中的任何地方都不存在。我知道使用xpath 是一个选项,但这并不意味着您不能通过 id 访问它。 只是想确认一下你的appium服务器和appium Python客户端的版本。 我的 appium-python-client 版本 => 0.47 Appium 服务器 => 1.13.0【参考方案2】:
import os
from appium import webdriver
import time

PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p))
desired_caps = 
    "deviceName": "emulator-5554",
    "platformName": "android",
    "appPackage": "com.android.calculator2",
    "appActivity": ".Calculator",
    "noReset": True

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

while True:
    try:
        el1 = driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.LinearLayout/android.view.ViewGroup[1]/android.widget.Button[6]')
        el1.click()
        time.sleep(1)
        el2 = driver.find_element_by_accessibility_id("times")
        el2.click()
        time.sleep(1)
        el3 = driver.find_element_by_xpath( 
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.LinearLayout/android.view.ViewGroup[1]/android.widget.Button[9]')
        el3.click()
        time.sleep(1)
        el4 = driver.find_element_by_accessibility_id("equals")
        el4.click()
        time.sleep(1)
    except ValueError:
        print(" ERROR BRO  ")
        pass
    break

有些 id 有效,有些则无效。我使用 xpath 而不是 id 和 错误得到改善。我认为id的数量在不断变化。 Xpath 提供了帮助。

【讨论】:

以上是关于在 Python appium 中返回 self.find_element (by = By.ID, value = id_) 和异常错误的主要内容,如果未能解决你的问题,请参考以下文章

Appium_Python_Api文档

Appium===Appium+Python API(转)

python appium 封装获取toast方法

Appium Python API 中文版

Appium Python API

使用 appium-python-client 在 android 中缩放操作