appium+python自动化98-非select弹出选择框定位解决

前言

遇到问题:document.getElementsByClassName(…)[0] is undefined 选择框如果是select标签的,可以直接用select专用的方法去定位点击操作。其它不是select选择框的时候,那就按正常操作步骤先点输入框,再点选项就行了。 可是有些选择框就是不听话,你会发现用selenium死活定位不到,这个时候只能用万能的js来解决了。

input选择框

1.先看下弹出框的常见,如下这种

2.查看元素属性,是input标签,并且是readonly属性,说明不能被输入

js调试

1.首先尝试了selenium的定位方法,发现点输入框是可以弹出选项的,只是点选项死活点不了。于是在浏览器用js去调试

先点输入框,让它弹出选项

元素属性
<input class="el-input__inner" type="text" autocomplete="off" placeholder="请选择" readonly="readonly">

document.getElementsByClassName(‘el-input__inner’)[2].click();

2.等选项弹出来了,再次在浏览器输入js去点选项

元素属性
<ul class="el-scrollbar__view el-select-dropdown__list" style="position: relative;">
    <li class="el-select-dropdown__item hover">
        <span>车赢银行</span>

document.getElementsByClassName(‘hover’)[0].click();

3.于是用selenium执行js,部分参考代码如下

js1 = "document.getElementsByClassName('el-input__inner')[2].click();"
self.driver.execute_script(js1)

time.sleep(1)

js2 = "document.getElementsByClassName('hover')[0].click();"
self.driver.execute_script(js2)

运行报错:

selenium.common.exceptions.WebDriverException: Message: document.getElementsByClassName(…)[0] is undefined

看这个报错后反复检查了语法,发现没毛病,并且反复在浏览器调试,也没问题,差点怀疑人生了!!!后来发现是前面一个js执行后失去了焦点,导致第二个js找不到焦点了

移动鼠标

1.当元素失去焦点后,死后定位不到,这个就好比你在浏览器上浏览小电影的时候,突然有个人发给QQ抖动窗口,此时你想继续浏览小网站,你需要重新点下网页,让鼠标聚集在网页上才能操作。 解决办法:把鼠标重新移过去

2.使用ActionChains移动鼠标到需要点击的元素上,参考代码

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

# ** 作者:上海-悠悠 QQ交流群:588402570**

driver=webdriver.Firefox()

# 省略中间步骤

js1 = "document.getElementsByClassName('el-input__inner')[2].click();"
self.driver.execute_script(js1)
time.sleep(1)

el = driver.find_element_by_xpath("//*[text()='车赢银行']")
ActionChains(self.driver).move_to_element(el).perform()

js2 = "document.getElementsByClassName('hover')[0].click();"
self.driver.execute_script(js2)

原文发布于微信公众号 - 从零开始学自动化测试(yoyoketang)

原文发表时间:2018-08-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Alan's Lab

Angular2 返回时组件生命周期函数不被调用的解决方法

这两天使用 Angular2 遇到的一个 @angular/router 的 bug:

1464
来自专栏iOS开发日记

iOS开发系列——文件结构

关于AppDelegate、main.m前面已经介绍过了,ViewController和Main.storyboard在后面介绍,这里先说一下Image.xca...

3998
来自专栏前端小叙

vue实现文章内容过长点击阅读全文功能

直接上代码: html: <div class="bodyFont clearfloat" id="bodyFont" ref="bodyFont" :clas...

4135
来自专栏Ray学习笔记

Jump Start Bootstrap 第4章

JavaScript是网页上事实上的脚本语言。流行的网页功能,例如:漂亮的图片幻灯片、下拉菜单、弹出框等,都可以结合JavaScript和CSS实现。在这章,我...

1274
来自专栏程序员同行者

mongodb4.0.2 复制集主从部署

复制集(Replica Sets),是一个基于主/从复制机制的复制功能,进行同一数据的异步同步,从而使多台机器拥有同一数据的都多个副本,由于有自动故障转移和恢复...

3965
来自专栏郭耀华‘s Blog

android 小知识点

1、 最近翻看以前的项目时候,想更改下布局文件,谁知道就改了个参数就提示如下的报错,百思不得其解,原来是这样解决的。小记一下。 更改layout的xml之后...

2836
来自专栏ytkah

微信公众平台编辑器可以剪裁和替换正文图片了

  之前微信公众平台后台编辑器上线封面图裁剪功能,时隔近两个月的今天,公众平台编辑器正文图片也可以剪裁和替换了,简单的图片裁剪编辑小编们再也不用放到ps等作图软...

3325
来自专栏Python研发

购物时添加数量

921
来自专栏前端侠2.0

draggable 属性 原

昨天是在document上绑定mousedown ,mousemove ,mouseup事件,来实时计算,并设置相应元素的宽度,这是最直接想到的办法,就不再多说...

1681
来自专栏Android小菜鸡

自定义组件——TitleView

  TitleView是一个常用的顶部标题栏组件,操作简单,可以快速搭建,并实现统一管理标题栏的目的。   采用建造者模式,支持快速构建back按钮、标题名、...

853

扫码关注云+社区

领取腾讯云代金券