selenium中元素操作之浏览器窗口滚动&网页日期控件操作(js操作)(五)
js的滚动条scrollIntoView()
Arguments[] - python与js之间的羁绊
1、移动到元素element对象的“底端”,与当前窗口的“底部”对齐:
driver.execute_script("arguments[0].scrollIntoView(false);",element)
2、移动到元素element对象的”顶端“,与当前窗口的”顶部“对齐(默认true):
driver.execute_script("arguments[0].scrollIntoview();", element)
3、移动到页面底部:
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
4、移动到页面顶部:
driver.execute_script("window.scrollTo(document.body.scrollHeight,0)")
二、使用的场景:
在selenium(python语言)做元素定位时,如果网页不支持自动滚动的话,有的元素在页面的不可见区域,这时候需要scrollIntoView()将其拖动到可见区域
举个栗子:
以百度搜索为例:搜索selenium,定位Selenium-简书这个链接,注意看滚动条的位置

代码如下:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys # 创建Chrome对象
driver = webdriver.Chrome()
# 访问百度
driver.get('http://baidu.com')
# 搜索selenium
driver.find_element_by_id('kw').send_keys("selenium", Keys.ENTER)
# 等待元素出现,滚动到定位元素处,在点击操作
loc = (By.XPATH, '//div[@id="6"]//a[contains(text(), "简书")]')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
ele = driver.find_element(*loc) # 执行js操作
driver.execute_script("arguments[0].scrollIntoView();", ele)
# 点击
ele.click()
在这里有一个坑,大家注意一下,由于我使用的是与当前窗口顶部对齐,百度经过特殊处理,百度搜索的框类似于excel固定首行的功能,页面滚动后,百度搜索框是固定不动的,所以与当前窗口顶部对齐就会出现百度搜索框遮挡住我们想要定位的链接(Selenium-简书这个链接),如图所示:

所以,想要这个链接显示出来的话,使用与当前窗口底部对齐的这个用法,这样就可以看到了,如图所示:
# 执行js操作
driver.execute_script("arguments[0].scrollIntoView(false);", ele)

这样就完美解决问题。
3、selenium中日期选择框操作
网页日期框一般都是选择的,无法输入,选择日期时元素定位不稳定,影响元素操作
接下来通过修改元素属性来输入日期,照样还是用execute_script方法来实现
举个栗子:(以12306订票为例)


通过js操作来实现对日期输入框的写入,首先使用dom对象定位元素,得到元素的value值,其实就是日期,日期框元素reaOnly的属性默认为true,是不可输入的状态;通过dom对象对元素的属性进行更改,readOnly=false,这样日期框就是可写入的状态,再次修改value的值,这样就搞定了
下边为代码示例:
from selenium import webdriver # 创建对象Chrome
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 访问12306
driver.get('https://www.12306.cn/index/') # 通过js操作写入日期
js_data = """
var e = document.getElementById("train_date")
e.readOnly = false
e.value = "2019-09-20"
"""
# 输入日期
driver.executed_script(js_data)
selenium中元素操作之浏览器窗口滚动&网页日期控件操作(js操作)(五)的更多相关文章
- 【基础】selenium中元素定位的常用方法(三)
一.Selenium中元素定位共有八种 id name className tagName linkText partialLinkText xpath cssSelector 其中前六种都比较简单, ...
- python selenium 处理时间日期控件(十六)
测试过程中经常遇到时间控件,需要我们来选择日期,一般处理时间控件通过层级定位来操作或者通过调用js来实现. 1.首先我们看一下如何通过层级定位来操作时间控件. 通过示例图可以看到,日期控件是无法输入日 ...
- webdriver高级应用- 操作日期控件
1. 通过点击的方式操作日期控件 #encoding=utf-8 from selenium import webdriver import unittest, time, traceback fro ...
- 【经验】Angularjs 中使用 layDate 日期控件
layDate 控件地址:http://laydate.layui.com/ 前情:原来系统中使用的日期控件是UI bootstrap(地址:https://angular-ui.github.io/ ...
- 在C#中子线程如何操作主窗口线程上的控件
在C#中子线程怎样操作主线程中窗口上控件 在C#中,直接在子线程中对窗口上的控件操作是会出现异常,这是因为子线程和运行窗口的线程是不同的空间,因此想要在子线程来操作窗口上的控件.是不可能简单的通过控件 ...
- Java+Selenium自动化对非输入框的日历或日期控件的处理
如图: 1.问题描述: 在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这 ...
- html select控件的jq操作
html select控件的jq操作 1.判断select选项中 是否存在Value="paraValue"的Item $("#selectid option[@valu ...
- Selenium+java - 日期控件的处理
前言 一般的日期控件都是input标签下弹出来的,设置日期使用selenium中的sendKeys 方法就可以解决. 但是我们也会碰到下面的时间日期控件(这个时候这个文本框是不允许我们输入时间的)如图 ...
- Android自定义垂直滚动自动选择日期控件
------------------本博客如未明正声明转载,皆为原创,转载请注明出处!------------------ 项目中需要一个日期选择控件,该日期选择控件是垂直滚动,停止滚动时需要校正日期 ...
随机推荐
- 分析WordPress数据表之用户表(功能篇)
数据表分析 wp_users wp_usermeta 用户系统就是靠着这两张表来实现的. 具体事例分析 添加用户 添加成功后,我们会分别在wp_users及wp_usermeta表中分别看到test0 ...
- 将jar包导入maven本地仓库
https://blog.csdn.net/lvdaan/article/details/79760976 一.首先配置环境变量 在path 中添加 maven的bin 的路径 例如:D:\soft\ ...
- 使用ES6删除对象中某些属性
const form = { id: '011', name: '测试一', description: '测试demo' } // 目标: 取到删除description属性的对象, 即下文的data ...
- 闭包(python)
1.闭包的理解 我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包. 2. 闭包的格式 下面用伪代码进行闭包格式的描 ...
- kotlin基础 密封类
密封类 密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时.在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一 ...
- docker run启动的容器挂掉了,数据怎么办
情景描述 在某个系统中,功能性的服务使用 docker stack deploy xxx 启动,某个国产数据库的服务单独使用 docker run xxx 启动,数据库服务没有将存储的位置挂载出来: ...
- jstl标签库使用报错index_jsp.java找不到问题
初学jstl的时候记得只需要讲jstl和standard的jar放在lib下面,然后jsp中使用对应导入语法就可以使用标签库了. 但那时候用的是myeclipes,myeclipes的导包的过程记得是 ...
- linux环境下安装python 3
说明: 在linux环境下,都默认安装python 2的环境,由于python3在python2的基础上升级较大,所以安装python 3环境用于使用最新的python 3的语法. 安装过程: 1.下 ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案中使用Onvif协议控制视频设备预置位转动
EasyNVR支持预置位控制,包括转到指定预置位,设置指定预置位,删除指定预置位.预置位在安防领域有较为普遍的应用,可以进行很多既定位置的跳转,很方便.之前我们说过如何用Onvif协议进行设备的发现, ...
- 硬盘分区及Linux文件系统
1. 硬盘物理结构 硬盘物理上主要分为: 盘片 磁道 扇区 机械臂 磁头 主轴 磁道: 当硬盘盘片旋转时,磁头若固定在一个位置上,则磁头会在盘片表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道.以盘片中心 ...