Selenium - IWebDriver 控制scroll bar到底部

有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作。一般用到操作滚动条的会两个场景:

注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉到最下方。    要操作的页面元素不在吸视范围,无法进行操作,需要拖动滚动条

其实,实现这个功能只要一行代码,但由于不懂js ,所以花了不小力气找到这种方法。

用于标识滚动条位置的代码

<body οnlοad= "document.body.scrollTop=0 ">

<body οnlοad= "document.body.scrollTop=100000 ">

如果滚动条在最上方的话,scrollTop=0 ,那么要想使用滚动条在最可下方,可以scrollTop=100000 ,这样就可以使滚动条在最下方。

场景一

先来解决场第一个问题,法律条款是一个内嵌窗口,通过firebug工具可以定位到内嵌入窗口可以定位到元素的id ,可以通过下面的代码实现。

js="var q=document.getElementById('id').scrollTop=10000" driver.execute_script(js)

注:由于法律条款的文字必须被阅读并接受才能进行下一步, 所以必须先将滚动条滑到底部,然后“接受”按钮才可用, 点击接受以后“下一步”按钮才可用。

场景二

有滚动条的页面到处可见,这个就比较容易找例子,我们以操作百度搜索结果页为例:

#coding=utf-8
from selenium import webdriver
import time#访问百度
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")#搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep(3)driver.quit()


转自: http://tech.ddvip.com/2013-10/1383059700204981.html

 

以下是我自己的代码, C# + IE:

using Se = OpenQA.Selenium;
using SIE = OpenQA.Selenium.IE;// 
SIE.InternetExplorerOptions _IEOptions = null;
SIE.InternetExplorerDriver _IEDriver = null;// init Internet driverprivate void InitIE(){_IEOptions = new SIE.InternetExplorerOptions();_IEOptions.IntroduceInstabilityByIgnoringProtectedModeSettings = true;_IEOptions.UnexpectedAlertBehavior = SIE.InternetExplorerUnexpectedAlertBehavior.Default;_IEOptions.ElementScrollBehavior = SIE.InternetExplorerElementScrollBehavior.Bottom;_IEDriver = new SIE.InternetExplorerDriver(_IEOptions);}private void Scroll Bar()
{IList<Se.IWebElement> frames = _IEDriver.FindElements(Se.By.TagName("frame"));Se.IWebElement frameDisplay = null;Se.IWebElement frameControlPanel = null;foreach (var frame in frames){if (frame.GetAttribute("name") == "ElementDisplayFrame"){frameDisplay = frame;}else if (frame.GetAttribute("name") == "ControlPanelFrame"){frameControlPanel = frame;}}if (frameDisplay != null){_IEDriver.SwitchTo().Frame(frameDisplay);// scroll to bottomSe.IWebElement ndaContainer = _IEDriver.FindElement(Se.By.Id("ndacontainer"));string id = ndaContainer.GetAttribute("id");var js = "var q = document.getElementById('" + id + "').scrollTop=10000";_IEDriver.ExecuteScript(js, null);ElementHP.Wait(_IEDriver);Se.IWebElement yesButton = _IEDriver.FindElement(Se.By.XPath("//input[@name='I1']"));if (yesButton != null && yesButton.Enabled){yesButton.Click();}}
}

 

转载于:https://www.cnblogs.com/qixue/p/3927325.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular常用命令行和指令

命令行: 命令行含义简写ng new 包名生成项目包ng n 包名ng serve启动项目, 端口号4200ng sng serve --open启动项目 并 在默认浏览器自动打开ng s -ong generate component 组件名生成组件ng g c 组件名ng generate directive 指令名生成指令ng g d 指令名ng generate pipe 管…

前端学习(1190):事件修饰符

传统方式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- v-cloak用…

mybatis --入门 单表增删改查-curd

目录1. mybatis 环境搭建2. 实体类映射文件配置&#xff08;写sql&#xff09;3. mybatis核心配置文件 &#xff08;环境配置&#xff09;4. 测试mybatis document https://mybatis.org/mybatis-3/zh/ mybatis in github https://github.com/mybatis/mybatis-3 1. mybatis 环…

ios开发之.pch文件的使用

案例&#xff1a;开源中国iOS客户端 当我们新建一个工程的时候&#xff0c;在Supporting FIles文件下会看到一个以 -Prefix.pch结尾文件的文件&#xff0c;pch全称是“precompiled header”&#xff0c;也就是预编译头文件&#xff0c;该文件里存放的工程中一些不常被修…

循环给对象创建属性名和属性值

4.7号笔记&#xff1a; ​ ① 循环给对象创建属性名和属性值&#xff1a; data.forEach(item > {item.identity identity;})console.log(data);

CWnd与HWND的区别与转换

一、区别HWND是句柄&#xff0c;CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识&#xff0c;即窗口句柄。这是一个SDK概念。 CWnd是MFC类库中所有窗口类的基类。微软在MFC中将所有窗口的通用操作都封装到了这个类中&#xff0…

字符串截取后两位,字符串转成数组,再转换位字符串

4.11号笔记 字符串去掉所有空格&#xff0c;转成数组&#xff0c;再转成字符串 var str 你好&#xff01; 世界 * * var arr str.replace(/\s/g, "").split("");//去掉所有空格并转成数组arr.splice(-2, 2); // 从最后面截取两位str arr.join(&q…

mybatis dao实现 || 接口代理方式实现

目录1、mybatis环境搭建2、mybatis dao接口实现3、动态代理方式&#xff0c;只实现Mapper接口mybatis入门单表操作demo mybatis dao层实现1. 实现dao层接口 2. 接口代理方式实现dao代理开发要求&#xff1a;​ Mapper接口开发方法只需要编写Mapper接口&#xff08;相当于dao接…

lvs-dr模式原理详解和可能存在的“假负载均衡”

原文地址&#xff1a; http://blog.csdn.net/lengzijian/article/details/8089661 lvs-dr模式原理 转载注明出处&#xff1a;http://blog.csdn.net/lengzijian/article/details/8089661 先附上一张原理图&#xff1a; 为了更清晰的表述lvs-dr原理&#xff0c;我们用tcpdump工具…

rem.js常用代码

rem.js (function flexible(window, document) {var docEl document.documentElement;var dpr window.devicePixelRatio || 1;// adjust body font size// 设置 em 默认字体所对应的大小function setBodyFontSize() {if (document.body) {document.body.style.fontSize 12 …

mybatis3 类型别名

目录问题描述解决方案方案二&#xff0c;直接扫描包问题描述 <!-- 插入操作 需要user参数 --><insert id"insertUser" parameterType"cn.bitqian.entity.User">insert into users1 values (#{userId}, #{userName}, #{userPassword})</inse…

vue-获取某个组件渲染的Dom根元素

function getComponentRootDom(comp, props){const vm new Vue({render: h > h(comp, {props})})vm.$mount();return vm.$el;}

动态sql (sql-if,sql-foreach)

目录1. UserMapper接口1. sql-if2. sql-foreach3. 多条件查询和根据多个id查询测试say sth.. 每当我回顾以前写jdbc分页&#xff0c;多条件查询时&#xff0c;我那是有多痛苦。 特别是当我拼接条件时&#xff0c;对象.getName 又是判断null&#xff0c;又是判断空字符串的。 还…

把一张合成图分拆出各个小图

反编译一个程序&#xff0c;看到一张合成图&#xff0c;想分拆出里面的每个小图&#xff0c;知道了各个图的坐标大小后&#xff0c;写了一个小方法&#xff0c;希望对大家有用哈 package com.bitimage;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStr…

6_js数组常用函数进阶与String

1 数组常用函数的应用 1.1 数组常用方法解析进阶 文档&#xff1a;const - JavaScript | MDN 课堂案例&#xff1a;01.find&Some方法的应用.html find() 从数组中找到满足条件的第一个元素并且并返回它。否则返回 undefined。 findIndex()*方法返回数组中满足提供的测试…

vue-快速原型开发

官方地址&#xff1a; https://cli.vuejs.org/zh/guide/prototyping.html

mybatis TypeHandler 类型处理器

目录1. 自定义日期类型处理器2. 配置自定义日期处理器3. 新增&#xff0c;查询1. 自定义日期类型处理器 继承mybatis提供的BaseTypeHandler覆写方法&#xff0c; 来转换Java和数据库中的字段package cn.bitqian.config;import org.apache.ibatis.type.BaseTypeHandler; import…

使用map递归树形结构

mapTree (data) {const reg /^e/;const regu /^u/;data.map(items > {if(items.children.length < 1){if(reg.test(items.userid)){items.disabled true //遍历树 拼入相应的disabled}else if(regu.test(items.userid)){items.children undefined }}else{this.mapTr…

分页查询插件PageHelper 5.x版本

目录1. jar包依赖2. mybatis核心文件配置3. 简简单单分页1. jar包依赖 <!--分页助手--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version></dependency&…

适用于ELment-UI级联多选框,数据回填,根据子节点的值查找完整路径

适用于ELment-UI级联多选框el-cascader&#xff0c;数据回填&#xff0c;根据子节点的值查找完整路径 已知子元素id,怎么获取它所有的父元素&#xff1f;用递归实现 /*** 查找匹配的完整路径* id: 匹配的值* data: 匹配的数组数据* prop: 匹配的字段名*/searchPath (id, …