当前位置: 移动技术网 > IT编程>脚本编程>Python > Appium新版本遇到的问题,不能通过 name 去定位元素抛 Message: Locator Strategy 'name' is not supported for this session

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

2019年12月04日  | 移动技术网IT编程  | 我要评论

2013房贷计算器,美女与野兽2017网盘,hifidiy论坛

环境:

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 files\appium\resources\app\node_modules\appium\node_modules\appium-android-driver\build\lib 找到 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()

 

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网