一. 实例

如何定位到下图第二个"抢投标",有一种方法是利用xpath定位 //a[@href="/loan/loan_detail/Id/7190.html" and text()="抢投标"],但是我们注意到,这个链接中的7190是id值,而页面中的id值是可以变化的,因此当标变化时,我们又得重新写xpath定位表示式了,那么,有没有一种更好的方式来解决这个问题,这就需要用到xpath的轴定位

二. xpath的轴定位

1. 轴运算

轴名称 描述
ancestor 选取祖先节点(包括父节点)
parent 选取父节点
preceding 选取当前节点标签之前的所有节点(按html页面先后顺序)
preceding-sibling 选取当前节点标签之前的所有兄弟节点
following 选取当前节点标签之后的所有节点(按html页面先后顺序)
following-sibling 选取当前节点标签之后的所有兄弟节点

2. 使用语法:轴名称::节点名称

例如: //div//table//td//preceding::td

3. 应用场景:页面显示为一个表格样式的数据列,需要通过组合来定位元素

4. 实例1:利用xpath轴定位,定位到下图第二个"抢投标"

实例2:定位到下图"企业3"中的"375万"

注意:我们不能通过//div[text()="企业3"]/following-sibling::div//span[text()="375万"]来定位,因为金额是可变的,如果这个标金额变化了,这个表达式就匹配不到了。所以定位时,一定要考虑到哪些是变化的,比如文本内容,元素下标(同一个span[n]),变化的一定不能作为定位表达式中的一部分,一般利用元素的固定的属性值来定位

三. 滚动条之后的元素定位

方法一:

使用js脚本拖动到指定的地方

第一步:找到这个元素

target = driver.find_element_by_id("id_keypair")

第二步:利用js

driver.execute_script("arguments[0].scrollIntoView();", target)    #拖动元素到可见元素去

实例:比如现在想定位下图中的id="local_current"所在的元素,但是这个元素所代表的区域不是页面的可见区域,我们需要执行js来拖动滚动条

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://news.baidu.com/")
driver.maximize_window()
sleep(2)
target = driver.find_element_by_id("local_current")
driver.execute_script("arguments[0].scrollIntoView();", target)

方法二:根据页面显示进行变通,发送tab键

例如:百度搜索结果—定位到滚动条滚动之后的某个链接。

发送tab键切换到密码框

from selenium.webdriver.common.keys import Keys

driver.find_element_by_id("id_login_method_0").send_keys(Keys.TAB)

拓展:

滚动到顶部:

js = "varq=document.documentElement.scrollTop=0"
driver.execute_script(js)

或者

driver.execute_script("window.scrollTo(document.body.scrollHeight, 0)")

滚动到底部:

js = "varq=document.documentElement.scrollTop=10000"
driver.execute_script(js)

或者

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

实例:拖动百度新闻页面的滚动条到底部和顶部

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://news.baidu.com/")
driver.maximize_window()
sleep(2)
#先将滚动条滚动到底部
js_1 = "varq=document.documentElement.scrollTop=10000"
driver.execute_script(js_1)
sleep(2)
#再将滚动条滚动到顶部
js_2 = "varq=document.documentElement.scrollTop=0"
driver.execute_script(js_2)

最新文章

  1. Spring MVC返回Map格式JSON数据
  2. C++ Primer Plus读书笔记
  3. Windows下查看端口占用
  4. Spring事务配置的五种方式 -- 越往后需要Spring版本越高
  5. Android的selector,背景选择器
  6. jquery之提示信息
  7. 理光C5502A 打印模糊问题
  8. EasyUI - ComboBox 下拉组件
  9. Inno Setup入门(十二)——Pascal脚本(1)
  10. Python快速入门(4)
  11. .Net开发的两个小技巧
  12. 公网访问阿里云数据库MongoDB——填坑日记
  13. .NET ClrProfiler ILRewrite 商业级APM原理
  14. Python 进程(一)理论部分
  15. Win32汇编学习(8):菜单
  16. 查看oracle数据库允许的最大连接数和当前连接数
  17. <asp:Button点击查询后,调用js中函数展现加载圈
  18. spring mvc 数据格式化
  19. cancel_delayed_work和flush_scheduled_work【转】
  20. SQLAlchemy(1) -- Python的SQLAlchemy和ORM

热门文章

  1. 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
  2. Linux中的自定义变量
  3. 024-Spring Boot 应用的打包和部署
  4. Dapper-Extensions
  5. python ipython notebook或者 jupyter notebook 的安装
  6. Linxu下jenkins部署和基本配置
  7. 使用 C#的 is 和 as 操作符来转型
  8. Yii2 自定义独立验证器
  9. 优化MD5和IP在(MySQL)数据库中的存储
  10. jpa,jdbc,hibernate/mybatis,数据库驱动