【问题标题】:Locator Strategy 'css selector' is not supported for this session issue with appiumappium 的此会话问题不支持定位器策略“css 选择器”
【发布时间】:2019-07-18 13:21:09
【问题描述】:

由于我是移动自动化的新手,我一直在尝试使用 appium maven 和 eclipse 运行简单的活动。但是当我尝试运行 Calculator 应用程序打开但元素不可访问。

这是我用来运行一个简单计算器的代码

  @BeforeClass
 public void setUp() throws MalformedURLException {

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("BROWSER_NAME", "Android");
    capabilities.setCapability("VERSION", "4.4.2");
    capabilities.setCapability("deviceName", "Emulator");
    capabilities.setCapability("platformName", "Android");

    capabilities.setCapability("appPackage", "com.android.calculator2");

    capabilities.setCapability("appActivity", "com.android.calculator2.Calculator");

    driver = new RemoteWebDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
}

@Test
public void testCal() throws Exception {

    WebElement two = driver.findElement(By.name("2"));
    two.click();

}

@AfterClass
public void teardown() {

}

我正在使用最新的稳定依赖项。 io.appium java-client 7.0.0 和 org.testng testng 6.14.3

FAILED: testCal
org.openqa.selenium.InvalidSelectorException: Locator Strategy 'css 
selector' is not supported for this session
For documentation on this error, please visit: 
https://www.seleniumhq.org/exceptions/invalid_selector_exception.html
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities {BROWSER_NAME: Android, VERSION: 4.4.2, appActivity: 
com.android.calculator2.Cal..., appPackage: com.android.calculator2, 
databaseEnabled: false, desired: {BROWSER_NAME: Android, VERSION: 4.4.2, 
appActivity: com.android.calculator2.Cal..., appPackage: 
com.android.calculator2, deviceName: Emulator, platformName: android}, 
deviceManufacturer: HUAWEI, deviceModel: FLA-LX2, deviceName: 
HXT7N18521000819, deviceScreenSize: 1080x2160, deviceUDID: 
HXT7N18521000819, javascriptEnabled: true, locationContextEnabled: false, 
networkConnectionEnabled: true, platform: LINUX, platformName: LINUX, 
platformVersion: 8.0.0, takesScreenshot: true, warnings: {}, 
webStorageEnabled: false}
Session ID: a604a166-3c0d-4e9c-a3e4-9b1ea734bee6
*** Element info: {Using=name, value=2}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown 
Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at...

【问题讨论】:

    标签: java maven selenium testng appium


    【解决方案1】:

    Appium 不是 Selenium:它们都使用 JSON 有线协议实现并且具有相似的 API,但不是相同的:

    原生安卓应用支持的定位器策略:

    • id(resource-id 查看属性);
    • accessbilityId(内容描述视图属性);
    • uiAutomator(最好阅读一下UiSelector);
    • className(UI 组件类型);
    • XPath。

    因此,您不能将By.name 定位器策略用于 Android 驱动程序会话,它不受支持。

    为方便起见,我建议在 Appium 原生测试中使用 MobileBy 代替 By:您将获得正确的选项。

    【讨论】:

      【解决方案2】:

      我在 2020 年 2 月 3 日尝试了这种方法,并且能够成功执行。我必须做出的改变是将 io.appium 更新到 7.2.0。

      我的案例/测试中的先决条件:Windows 机器,创建 Nexus S AVD,启动 Appium 和 AVD。

      最重要的

      URL url = new URL("http://127.0.0.1:4723/wd/hub");
      driver = new AndroidDriver<MobileElement>(url, capabilities);
      MobileElement two =(MobileElement)driver.findElement(By.id("com.android.calculator2:id/digit_9"));   
      two.click();
      

      【讨论】:

      • 我正在尝试测试使用 Ionic 编写的 Hybrid Mobile 应用程序。你对此有什么建议吗?我曾尝试将上下文切换到网络,但我也被困住了。
      【解决方案3】:

      By.name("text")Appium v1.5.0 开始删除。

      还只是添加 cssSelector 策略 + 诸如 getAttribute("color/background") 之类的方法,例如 Selenium 中的 getAttribute("color/background"),Appium 不支持原生应用程序,因为 Android 的底层单元测试框架不支持这些方法,即 UIAutomator

      您可以使用以下选项来点击计算器的数字

      driver.findElement(By.id(“com.android.calculator2:id/digit5”)).click();
      driver.findElement(By.xpath(“//android.widget.Button[contains(@resource-id,'digit5') and @text='5']”)).click();
      driver.findElementByAccessibilityId(“plus”).click();
      driver.findElement(By.xpath(“//android.widget.Button[@text='5']”)).click();
      

      【讨论】:

        【解决方案4】:

        始终使用类名和文本名来创建 xpath。

        const loginbutton=await driver.$("//android.widget.TextView[@text='login']")
        
        
        await loginbutton.click()
        

        驱动来自能力

        class name --&gt; android.widget.TextView

        text name --&gt;login

        所以总是使用类名和文本名来创建更好更好的 xpath。

        适用于所有 android+appium+wdio

        【讨论】:

          【解决方案5】:

          最近我也遇到了这个问题。如果有人想知道,这里是我为解决这个问题所做的事情。

          1. 更新了 java 客户端。我在 pom 中将其更新为 7.2.0 版。
          2. 删除了 selenium-java 依赖项。这是需要删除的,因为 java-client 已经具有 selenium 依赖项。如果不删除可能会导致冲突。
          3. 更新我的 maven 项目。
          4. 重新运行测试。我刚刚尝试使用模拟器单击计算器应用程序中的数字 5,它成功了

          【讨论】:

          • 如果您删除了 selenium-java 依赖项,那么您是如何使用 DesiredCapabilities 的?你能分享你的代码和 pom.xml 文件吗?
          猜你喜欢
          • 2019-02-08
          • 1970-01-01
          • 2019-08-29
          • 1970-01-01
          • 2016-09-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2019-05-14
          相关资源
          最近更新 更多