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自定义垂直滚动自动选择日期控件
------------------本博客如未明正声明转载,皆为原创,转载请注明出处!------------------ 项目中需要一个日期选择控件,该日期选择控件是垂直滚动,停止滚动时需要校正日期 ...
随机推荐
- hotspot的Heap Memory和Native Memory
JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory.前者供Java应用程序使用的:后者也称为C-Heap,是供JVM自身进程使用的.Native Memory没有 ...
- IntelliJ IDEA 2019从入门到癫狂 图文教程!
阅读本文大概需要 6 分钟. 作者:yizhiwazi 来源:www.jianshu.com/p/9c65b7613c30 前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代 ...
- 解决 No IDEA annotations attached to the JDK 1.8和xml文件没有代码提示
Android studio3.3 用着用着突然xml里没有代码联想了,忙着做其他的就没管,写xml的时候就硬写... 然后今天用着突然在class文件上方提示No IDEA annotations ...
- await 只能在 async 中使用吗? 并不是
for await (let a of [1,2,3]) { console.log(a) }
- PMP 第8章错题总结
1.项目经理为项目的可交付成果定义验收标准.这些应记录在项目范围说明书2.项目的总体预算是“成本基准+管理储备”,成本基准里本身已包含了应急储备.工作包成本估算.活动成本估算3.范围基准包含----项 ...
- fedora清理旧内核
先查看已安装的内核: rpm -qa|grep kernel 然后查看下当前在用的内核: uname -r 最后是删除内核: yum remove xxxx
- node框架那些事儿
一.简单介绍 express:适合初学者,模版引擎,路由,中间件 koa2:核心中间件 eggjs:企业级应用框架 二.express 服务端框架,提供路由功能,异常处理.路由系统+中间件构成web开 ...
- js小数计算的问题,为什么0.1+0.2 != 0.3
//下面可以用原生解决 0.1+0.2 的问题 parseFloat((0.1 + 0.2).toFixed(10)) 复制代码 console.log(0.1+0.2===0.3); //true ...
- web page popup window model
jQuery UI dialog: https://jqueryui.com/dialog/ Semantic UI https://semantic-ui.com/modules/modal.htm ...
- elastalert 用import属性来组织,引入配置
对应rule的一些公用规则,可以放到一个或者多个头文件中.主的rule yaml文件引入即可.文件名随意,最好别用yaml后缀,要不会被当做一个rule.另外import在rule文件中只能出现一次. ...