WebElement--定位经验
通常,我们这页面中定位一个元素,如果HTML中明明有却定位不到,我们一定会从这两个方面考虑。
第一:是不是页面中有多个iframe/frame结构,很多情况下我们需要通过切换iframe/frame结构来定位,如果页面中存在iframe/frame的情况,我们先要排查是否是因为我们的driver所在位置与我们要定位的element不在同一iframe/frame中,排查方法:查看HTML结构,页面中找到我们要定位的元素,一级一级向上,如果被直至确定其最上级是一个iframe/frame,并且确认driver当前所在位置不被包含于iframe/frame结构中;我们要做的就是将我们的driver切换至这个iframe/frame结构中再定位。
例子: 
假如,我们的driver所在在’‘且不被包含于iframe结构中,我们要定位iframe 表单结构中的‘My97DatePicker’这个元素,我们要先将driver切换至iframe结构中–driver.switch_to.frame() 然后再定位我们的要定位的元素。 这里的的难点应该是关于iframe的定位:driver.switch_to.frame() 这个方法“()”中可以是iframe的id/name(如果是固定的),也可是一个Webelement(这个可以通过定位iframe来获取)我这里,由于iframe没有id和name(当你遇到的id/name是随机的时候也可以这样),思路:我的driver在iframe的上一级,在整个HTML中搜索iframe有且只有一个iframe结构,所有我利用标签(driver.find_elemen_by_tag("iframe"))来定位,然后切换结构层,定位我们要定位的元素,脚本实现:
Webelement = driver.find_elemen_by_tag(“iframe”)
driver.switch_to.frame(Webelement )
driver.find_element_by_link_text(“My97DatePicker”)
iframe/frame的切换方法还有很多,大家自己普及(有时间我会考虑出一篇相关思路整理发表)
第二:是否不显示在页面中。随着JavaScript的普及,很多元素的定位我们都得考虑是否这个元素被触发为可见状态了。
下面列举两种需要出发的情况:
1、元素被包含在下拉列表中,不点击下列表时无法选中。
这种情况很好结局,无非就是先定位并点击列表,在定位我们要定位的元素
2、元素被包含在提示框中,鼠标得悬浮在其上才能触发JavaScript,元素才可见被选中。
这种情况,我们就需要引用鼠标悬浮的方法,脚本实现:
引用selenium公共方法 ActionChains
from selenium.webdriver.common.action_chains import ActionChains
鼠标悬浮至element上:
Webelement = driver.find_elemen_by_xxx (element)
ActionChains(driver).move_to_element(Webelement).perform()
然后再定位我们的元素。
黑科技:
排除上面两种我们还定位不到元素的思路:
组合定位方法
定位页面中所有相同的元素(class_name相同、xpath相同、css相同、tag_name相同…等等),再通过元素的属性值来筛选达到定位至该元素(当你死活定位不到这个元素的时候开业尝试)
例子,举例通过不同的定位方式定位页面中相同元素: 
<div class="J_adv" data-view="true" data-mod="ad_popu_259"
data-mtp="66" data-order="806" data-con="ad_content_3933"></div>
方法一: find_element_by_xpath(‘//*[@id=”feedlist_id”]/div‘)
方法二:find_element_by_class_name(‘J_adv’)
方法三:
for element in find_element_by_xpaths('//*[@id=”feedlist_id”]/div'): \
''' 这些if都是限定条件,根据就是 element.get_attribute() 这个方法,这个方法可以获取WebElement的任何属性。 这时,我们就可以根据 WebElment 的任何属性来限定我们要定位的元素 '''
if element.get_attribute('class') == 'J_adv':
if element.get_attribute('data-view')=='true':
if element.get_attribute('data-mod')=='ad_popu_259':
element.click()
同样的,我们还能使用这么些方法去限定: element.is_displayed():返回元素结果是否可见(True 或 False) #常用 element.is_selected():返回元素结果是否被选中(True 或 False) #一般不用 还是写文章不会写啊,我感觉自己想表达的东西还是没有完全表达出来,我是真心想让每个对webelement定位觉得困难的朋友有所收获,唉~文笔不够啊。 另外总结一下经验之谈的两种定位不到元素的情况: 1、页面未完全加载:这种情况可以尝试使用显性等待、强制等待等方式: 显性等待:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
locator = (By.XPATH, element)
#显性等待页面中所有元素
WebDriverWait(driver, 15, 0.5).until(EC.visibility_of_all_elements_located(locator))
#等待页面中是至少一个元素存在
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
#处理这些还有很多大家自己去拓展
强制等待: import time time.sleep(2) 2、页面加载完成元素需要JavaScript的渲染,未渲染完全 这里和大家说一下,如果页面加载完成一般这个元素都是可以在页面中获取了,但是在未渲染完全的情况下是不可见的,所以我们可以通过上面的显性等待、强制等待、或者 一些 循环语句结合 element.is_displayed() 来达到效果。
总结:定位元素失败只有三种原因:遮罩层、表单结构、渲染时间。
WebElement--定位经验的更多相关文章
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的.当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题.因为当时开发任务较 ...
- XPath和CssSelector定位总结
1. 介绍XPath和CssSelector 2. XPath有哪些方式 2.1 通过XPath语法 2.2 Contains关键字 2.3 Start-With 2.4 Or和And关键字 2.5 ...
- 软件测试之BUG分析定位概述(QA如何分析定位BUG)
你是否遇到这样的场景? QA发现问题后找到DEV说: 不好了,你的程序出问题了! DEV(追查半小时之后): 唉,是你们测试环境配置的问题 唉,是你们数据不一致 唉,是你们**程序版本不对 唉,是** ...
- python+selenium:iframe框架中多种定位
方法一:通过索引,id,name,WebElement定位 from selenium import webdriverdriver = webdriver.Firefox()driver.switc ...
- 软件测试之BUG分析定位概述(QA如何分析定位BUG)【转自 https://blog.csdn.net/kaka1121/article/details/51538979】
你是否遇到这样的场景? QA发现问题后找到DEV说: 不好了,你的程序出问题了! DEV(追查半小时之后): 唉,是你们测试环境配置的问题 唉,是你们数据不一致 唉,是你们**程序版本不对 唉,是** ...
- IE浏览器Web自动化
一.常见问题 1.1 在IE11浏览器下运行自动化脚本特别缓慢. 具体表现:(64位IE驱动器下)脚本运行慢,尤其是文本框输入,其它浏览器是一起输入,但IE是单个字节输入字符串 解决方法:更换IE的 ...
- Selenium基本使用(十三)测试中常见问题
我们在使用selenium测试过程中,经常会遇到这样的问题: 1.frame或iframe <iframe id='frame1' name='frame1'> <input typ ...
- Greys Java在线问题诊断工具
摘要: 线上系统为何经常出错?数据库为何屡遭黑手?业务调用为何频频失败?连环异常堆栈案,究竟是那次调用所为? 数百台服务器意外雪崩背后又隐藏着什么?是软件的扭曲还是硬件的沦丧? 走进科学带你了解Gre ...
- 我的app自动化实战练习一
''' -*- coding: utf-8 -*- @Time : 2019/6/10 0010 10:39 @Author : 无邪 @File : test_data.py @Software: ...
随机推荐
- 一个简单的“将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态”的函数
前段时间,做了一个某游戏的辅助计算工具,其中遇到一个排列组合问题.抽象出来就是 将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件, 请给出所有的这些状态. 随意找了下没有现 ...
- Android 心跳包心跳连接 如何实现android和服务器长连接呢?推送消息的原理
前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权.例如:微信,QQ,天气预报等等,相信好处和用户体验相信大家都知道吧. 提出问题:这种功能必须涉及cl ...
- idea 2019.3 最新破解补丁和激活码,可破解至2089年!
链接:https://blog.csdn.net/qq_42914528/article/details/85617901 上面方法失效了,请尝试以下方式激活(2020.1.6更新) idea激活码( ...
- wordcloud安装错误信息的解决
参考链接:https://www.zhihu.com/people/si-kong-ji-54/posts 在windows下command里运行指令 pip install wordcloud ...
- MySQL 存储引擎(MyISAM、InnoDB、NDBCluster)
前言 MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系. 由于各存储引擎功能特性差异较大 ...
- Leetcode -- 两数之和Ⅰ
1. 两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 示例:给定 nums = [2, 7, 11, 15 ...
- [转帖西部数据的Zonefs将会登陆Linux 5.6内核]
西部数据的Zonefs将会登陆Linux 5.6内核 https://www.cnbeta.com/articles/tech/948875.htm 据说SMR 能够提高25%的存储密度 但是会造成严 ...
- 因子分析和PCA总结
因子分析和PCA 定义 因子分析就是数据降维工具.从一组相关变量中删除冗余或重复,把相关的变量放在一个因子中,实在不相关的因子有可能被删掉.用一组较小的“派生”变量表示相关变量,这个派生就是新的因子. ...
- RaspBerry--解决无法用 ssh 直接以 root 用户登录
参考:https://www.cnblogs.com/xwdreamer/p/6604593.html 以普通用户登录,然后切换至 root 用户. 编辑 /etc/ssh/sshd_config 添 ...
- Windows下将Python源代码.py文件封装成exe可执行文件方法
安装pyinstaller cmd中使用pip安装 pip install pyinstaller 同时会自动安装pywin32(pip真慢50M这里就走20KB),可以进行切换为国内源进行提速. 就 ...