Appium [求助] Hybrid App 里 Webview 的元素 click 无效

和曦 · 2016年02月25日 · 最后由 扫地僧 回复于 2016年02月27日 · 1963 次阅读

环境:Win7-32bit,Appium-server (1.4.16),ruby_lib (8.0.0),appium_console (1.0.4)

最近在尝试用 Appium 做 Hybrid App 的自动化测试,原生部分没有什么问题,
但是切入 Webview 后,里面的元素操作后却没有效果,不知道什么原因。

下面是 Debug 过程,

切换到 Webview 里面后,可以定位到元素,但是 click 元素却报 “元素不可见错误”。
部分 Appium-server 端的 log 如下:

2016-02-25 08:58:31:290 - info: --> POST /wd/hub/session/68723b72-563c-46dd-9d1f-780d920a1d14/element {"using":"css selector","value":"ul > li img"}
2016-02-25 08:58:31:294 - info: JSONWP Proxy: Proxying [POST /wd/hub/session/68723b72-563c-46dd-9d1f-780d920a1d14/element] to [POST http://127.0.0.1:9515/wd/hub/session/4eafd2de161edb0bf40555388533ae35/element] with body: {"using":"css selector","value":"ul > li img"}
2016-02-25 08:58:31:460 - info: JSONWP Proxy: Got response with status 200: {"sessionId":"4eafd2de161edb0bf40555388533ae35","status":0,"value":{"ELEMENT":"0.9846464938018471-1"}}
2016-02-25 08:58:31:462 - info: JSONWP Proxy: Replacing sessionId 4eafd2de161edb0bf40555388533ae35 with 68723b72-563c-46dd-9d1f-780d920a1d14
2016-02-25 08:58:31:471 - info: <-- POST /wd/hub/session/68723b72-563c-46dd-9d1f-780d920a1d14/element 200 177.920 ms - 106 
2016-02-25 08:58:42:400 - info: --> POST /wd/hub/session/68723b72-563c-46dd-9d1f-780d920a1d14/element/0.9846464938018471-1/click {}
2016-02-25 08:58:42:403 - info: JSONWP Proxy: Proxying [POST /wd/hub/session/68723b72-563c-46dd-9d1f-780d920a1d14/element/0.9846464938018471-1/click] to [POST http://127.0.0.1:9515/wd/hub/session/4eafd2de161edb0bf40555388533ae35/element/0.9846464938018471-1/click] with body: {}
2016-02-25 08:58:42:512 - info: JSONWP Proxy: Got response with status 200: {"sessionId":"4eafd2de161edb0bf40555388533ae35","status":11,"value":{"message":"element not visible\n  (Session info: webview=33.0.0.0)\n  (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1b...

html 的源码如下,似乎并没有设置元素属性是隐藏。

<div class="ul-container">
    <ul id="targetUl" sort>
        <li ng-repeat="m in infoA">
            <div class="device_item"><img src={{m.path}} ng-mouseup="kedup($index)" ng-mousedown="kedown($index)" name="devicesImg" />
                <!-- ng-mouseup="kedup($index)" ng-mousedown="kedown($index)"-->
                <div class="shade" style="display: none"></div>
            </div>
            <p>{{m.name}}</p>
        </li>
        <li>
            <div ng-click="bindDevice()"><img src="../img/add.PNG" />
            </div>
            <p>
                添加设备
            </p>
        </li>
    </ul>
</div>

此外,在调试过程中,还遇到的问题就是:available_contexts 有时能获取到 Webview,有时却不能。(环境都一样)
各种 Google 以后,并没有找到类似问题。
有哪位朋友遇到过吗?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 7 条回复 时间 点赞

click 元素却报 “元素不可见错误”。

做下时间等待

available_contexts 有时能获取到 Webview

不稳定

#1 楼 @lihuazhang
我脚本里其实已经做了 sleep 延时等待,但是结果依旧。

而如果用 wait.until { find_element(:css, 'ul > li img').displayed? },
结果则是等待 30s 后超时,元素仍旧没有 displayed。

#2 楼 @laiyuncong8404 angular 的 dom 感觉有可能真的把这个元素的属性给干掉了。。

#3 楼 @lihuazhang
我最初也是这么怀疑的,因为
增加显示属性后,Debug 图片的 size 显示是 0,无解了

<li>
    <div ng-click="bindDevice()" style="display: block"><img src="../img/add.PNG" />
    </div>
    <p>
        添加设备
    </p>
</li>
[7] pry(main)> addBtn = find_element(:css, 'ul > li img')
#<Selenium::WebDriver::Element:0x..f81060ccc id="0.47901470004580915-1">
[8] pry(main)> addBtn.displayed?
false
[9] pry(main)> addBtn.size
{
     :width => 0,
    :height => 0
}

execute_script或者ActionBuilder点会怎么样?

我也正考虑用 js 来搞了,没招了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册