• Appium新版本遇到的问题,不能通过 name 去定位元素抛 Message: Locator Strategy 'name' is not supported for this session


    环境:

    1、Appium: 1.15.1

    2、Python: 3.7.0

    3、Selenium: 3.141.0

    4、IDE: Pycharm

    5、PC:Windows 10

    问题:在 Pycharm 中输入 driver.find_element_by_后可以直接联想出name这个,然后就通过这个name属性去定位界面元素,在运行时居然报 "Locator Strategy 'name' is not supported for this session",从这个错误来看,显然可以看出不是selenium的锅,要不然 pycharm 也不可能联想出来,那么这个很可能是 appium 不支持这个属性了,据说是从appium 1.5版本之后就不支持这个了,为了验证这个观点,到这个目录下:C:Program FilesAppium esourcesapp ode_modulesappium ode_modulesappium-android-driveruildlib 找到 driver.js 打开如下,看到没它只支持下面五种属性

    class AndroidDriver extends _appiumBaseDriver.BaseDriver {
      constructor(opts = {}, shouldValidateCaps = true) {
        super(opts, shouldValidateCaps);
        this.locatorStrategies = ['xpath', 'id', 'class name', 'accessibility id', '-android uiautomator'];
        this.desiredCapConstraints = _desiredCaps.default;
        this.sessionChromedrivers = {};
        this.jwpProxyActive = false;
        this.jwpProxyAvoid = _lodash.default.clone(NO_PROXY);
        this.settings = new _appiumBaseDriver.DeviceSettings({
    

      

    那么如果一定要用name这个属性来进行元素定位的话,那么如何操作呢,下面介绍两种方法:

    1、修改driver.js文件,添加name到locatorStrategies里去,经验证这种方法不可行,仍然报同样错误,显然通过简单的修改这个方式不太可行

    class AndroidDriver extends _appiumBaseDriver.BaseDriver {
      constructor(opts = {}, shouldValidateCaps = true) {
        super(opts, shouldValidateCaps);
        this.locatorStrategies = ['xpath', 'id', 'class name', 'accessibility id', '-android uiautomator', 'name'];
        this.desiredCapConstraints = _desiredCaps.default;
        this.sessionChromedrivers = {};
        this.jwpProxyActive = false;
        this.jwpProxyAvoid = _lodash.default.clone(NO_PROXY);
        this.settings = new _appiumBaseDriver.DeviceSettings({
    
    1 driver.find_element_by_name("Browsing").click()

     

    2、通过find_element_by_android_uiautomator这个来进行元素定位,这个是基于uiautomator原生的来支持,这个肯定是会支持界面中所有支持的元素定位,直接上脚本,这个是可以正常跑通的。

     1 # -*- coding:utf-8 -*-
     2 
     3 import unittest
     4 import time
     5 from appium import webdriver
     6 from selenium.webdriver.common.by import By
     7 from selenium.webdriver.support.ui import WebDriverWait
     8 from selenium.webdriver.support import expected_conditions as EC
     9 
    10 server = 'http://localhost:4723/wd/hub'
    11 desired_capabilities = {
    12     'platformName': 'Android',
    13     'deviceName': 'abcdefg1234',
    14     'appPackage': 'com.sina.weibo',
    15     'appActivity': 'com.sina.weibo.VisitorMainTabActivity',
    16     'autoGrantPermissions': True
    17     }
    18 
    19 driver = webdriver.Remote(server, desired_capabilities)
    20 
    21 time.sleep(30)
    22 
    23 driver.find_element_by_android_uiautomator("new UiSelector().text("Browsing")").click()

    建议:以后在写适用appium自动化框架的脚本时,凡是不能通过这几个属性['xpath', 'id', 'class name', 'accessibility id']直接定位元素的,都直接用 '-android uiautomator' 这个属性来进行定位,其实大家也能发现,前面那几个属性在uiautomator里面是全部包括的(xpath除外),下面把这几个对应关系列举如下:

    driver.find_element_by_id("com.sina.weibo:id/tv_title_lookaround").click()  <==> driver.find_element_by_android_uiautomator("new UiSelector().resourceId("com.sina.weibo:id/tv_title_lookaround")").click()

    driver.find_element_by_name("Browsing").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().text("Browsing")").click()

    driver.find_element_by_accessibility_id("Browsing").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().description("Browsing")").click()

    driver.find_element_by_class_name("android.widget.TextView").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().className("android.widget.TextView")").click()

    注:以上四个对应关系并没有一个一个去验证,只是根据自己的理解写出来,有错误的地方还请各路英雄好汉指出,谢谢!

  • 相关阅读:
    三个问题
    2014-7
    2014-5
    2014-2
    2014-1
    2013-11
    mysql中对表操作----为所有列插入数据
    Redis做消息队列
    收集Nginx-access,Nginx-error日志
    .Nginx安装filebeat收集日志:
  • 原文地址:https://www.cnblogs.com/aziji/p/11982867.html
Copyright © 2020-2023  润新知