selenium的后续来了,主要是在python里用的,所以看此文章需要一定的pthon基础(切记,切记,切记)


目录

JS 的使用

1.JS 处理滚动条

一、JavaScript简介

二、控制滚动条高度

三、横向滚动条

四、浏览器

五、元素聚焦

六、获取浏览器名称:driver.name

七、兼容性

八、scrollTo函数

九、代码如下:

2.JS 处理富文本

一、定位iframe

二、js输入中文

三、代码如下:

3.JS 处理日历控件(修改readonly属性)

一、日历控件:

二、去掉readonly属性

三、用js去掉readonly属性

四、输入日期

五、js方法输入日期

六、代码如下:

4. JS处理内嵌div滚动条

一、内嵌滚动条

二、横向滚动

三、纵向滚动

四、用class属性定位

5.JS处理多窗口

一、多窗口情况

二、查看元素属性:target="_blank"

三、去掉target="_blank"属性

四、js去掉target="_blank"属性

五、代码如下:

6.JS 解决click失效问题

一、遇到的问题

二、点击父元素

三、js直接点击

四、代码如下:

7.18种定位方法献给大家

一、十八种定位方法

二、element和elements傻傻分不清

三、elements定位方法


JS 的使用

1.JS 处理滚动条

前言
         selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。
常见场景:
        当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上。滚动条是无法直接用定位工具来定位的。selenium里面也没有直接的方法去控制滚动条,这时候只能借助J了,还好selenium提供了一个操作js的方法:execute_script(),可以直接执行js的脚本。

一、JavaScript简介

1.JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HTML5的手机App,交互逻辑都是由JavaScript驱动的。简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。那么问题来了,为什么我们要学JavaScript?

2.有些特殊的操作selenium2+python无法直接完成的,JS刚好是这方面的强项,所以算是一个很好的补充。对js不太熟悉的,可以网上找下教程,简单了解些即可。
http://www.w3school.com.cn/js/index.asp4

二、控制滚动条高度

1.滚动条回到顶部:

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

2.滚动条拉到底部

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

3.这里可以修改scrollTop 的值,来定位右侧滚动条的位置,0是最上面,10000是最底部。

三、横向滚动条

1.有时候浏览器页面需要左右滚动(一般屏幕最大化后,左右滚动的情况已经很少见了)。

2.通过左边控制横向和纵向滚动条

scrollTo(x, y)js = "window.scrollTo(100,400);"

driver.execute_script(js)

3.第一个参数x是横向距离,第二个参数y是纵向距离

四、浏览器

1.以上方法在Firefox上是可以的,但是用Chrome浏览器,发现不管用。
        谷歌浏览器就是这么任性,不听话,于是用以下方法解决谷歌浏览器滚动条的问题。
        2.Chrome浏览器解决办法:

js = "var q=document.body.scrollTop=0"
        driver.execute_script(js)

五、元素聚焦

1.虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位置,有可能每次打开的页面不一样,元素所在的位置也不一样,怎么办呢?
        2.这个时候我们可以先让页面直接跳到元素出现的位置,然后就可以操作了。同样需要借助JS去实现。
        3.元素聚焦:
        target = driver.find_element_by_xxxx()
        driver.execute_script("arguments[0].scrollIntoView();", target)

六、获取浏览器名称:driver.name

1.为了解决不同浏览器操作方法不一样的问题,可以写个函数去做兼容。
        2.先用driver.name获取浏览器名称,然后用if语句做个判断

七、兼容性

不同浏览器兼容,如火狐、谷歌、IE等

八、scrollTo函数

有个小伙伴说这个scrollTo函数不存在兼容性问题,作者就借花献佛了哈。
        --scrollHeight 获取对象的滚动高度。 
        --scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。 
        --scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。

--scrollWidth 获取对象的滚动宽度。

scrollTo函数不存在兼容性问题,直接用这个函数就可以了

#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)
#滚动到顶部
js = "window.scrollTo(0,0)"
driver.execute_script(js)

九、代码如下:

# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
print driver.name
## 回到顶部
#def scroll_top():
#        if driver.name == "chrome":
#               js = "var q=document.body.scrollTop=0"
#        else:
#                js = "var q=document.documentElement.scrollTop=0"
#        return driver.execute_script(js)
# 拉到底部
#def scroll_foot():
#       if driver.name == "chrome":
#                js = "var q=document.body.scrollTop=10000"
#        else:
#                js = "var q=document.documentElement.scrollTop=10000"
#        return driver.execute_script(js)
#滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)
#滚动到顶部
js = "window.scrollTo(0,0)"
driver.execute_script(js)
# 聚焦元素
target = driver.find_element_by_xxxx()
driver.execute_script("arguments[0].scrollIntoView();", target)

2.JS 处理富文本

这篇解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,本篇讲解通过js的方法处理富文本上iframe的问题

以下就是关于前期咱们写的配置,这个就不细说了,大家可以翻之前文章去写哈!

一、定位iframe

1.打开编辑界面后先不要急着输入内容,先sleep几秒钟
        2.输入标题,这里直接通过id就可以定位到,没什么难点
        3.接下来就是重点要讲的富文本的编辑,这里编辑框有个iframe,所以需要先切换

(咱们要打开F12以后,在里边查看并找到iframe)

二、js输入中文

1.这里定位编辑正文是定位上图的红色框框位置body部分,也就是id=tinymce

2.定位到之后,用js的方法直接输入,无需切换iframe

3.直接点保存按钮,无需再切回来

三、代码如下:

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# profileDir路径对应直接电脑的配置路径
profileDir = r'C:\xxx\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
bolgurl = "http://www.cnblogs.com/"
yoyobolg = bolgurl + "yoyoketang"
driver.get(yoyobolg)
driver.find_element_by_id("blog_nav_newpost").click()
time.sleep(5)
edittile = u"Selenium2+python自动化23-富文本"
editbody = u"这里是发帖的正文"
driver.find_element_by_id("Editor_Edit_txbTitle").send_keys(edittile)
body = "这里是通过js发的正文内容"
# js处理iframe问题(js代码太长了,我分成两行了)
js = 'document.getElementById("Editor_Edit_EditorBody_ifr")' \'.contentWindow.document.body.innerHTML="%s"' % body
driver.execute_script(js)
# 保存草稿
driver.find_element_by_id("Editor_Edit_lkbDraft").click()

3.JS 处理日历控件(修改readonly属性)

前言
    日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如何解决日历控件为readonly属性的问题。
    基本思路:先用js去掉readonly属性,然后直接输入日期文本内容

一、日历控件:

1.打开12306的车票查询界面,在出发日期输入框无法直接输入时间
        2.常规思路是点开日历控件弹出框,从日历控件上点日期,这样操作比较烦躁,并且我们测试的重点不在日历控件上,只是想输入个时间,做下一步的操作
        3.用firebug查看输入框的属性:readonly="readonly",如下:

二、去掉readonly属性

1.很明显这种元素的属性是readonly,输入框是无法直接输入的,这时候需要先去掉元素的readonly属性,然后就可以输入啦。

2.点左下角firebug的“编辑按钮”,找到对应元素,直接删除readonly="readonly",然后回车。

3.在页面出发日位置输入:yoyoketang 试试,嘿嘿,有没有发现可以输入成功。当然这里只是为了验证可以输入内容,测试时候还是输入测试的日期。

三、用js去掉readonly属性

1.用js去掉元素属性基本思路:先定位到元素,然后用removeAttribute("readonly")方法删除属性。
        2.出发日元素id为:train_date,对应js代码为:'document.getElementById("train_date").removeAttribute("readonly");'

四、输入日期

1.输入日期前,一定要先清空文本,要不然无法输入成功的。
        2.这里输入日期后,会自动弹出日历控件,随便点下其它位置就好了,接下来会用js方法传入日期,就不会弹啦!

五、js方法输入日期

1.这里也可以用js方法输入日期,其实很简单,直接改掉输入框元素的value值就可以啦。

六、代码如下:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://kyfw.12306.cn/otn/index/init")
# 去掉元素的readonly属性
js = 'document.getElementById("train_date").removeAttribute("readonly");'
driver.execute_script(js)
# 用js方法输入日期
js_value = 'document.getElementById("train_date").value="2016-12-25"'
driver.execute_script(js_value)
# # 清空文本后输入值
# driver.find_element_by_id("train_date").clear()
# driver.find_element_by_id("train_date").send_keys("2016-12-25")

4. JS处理内嵌div滚动条

前言
    上面专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦。

一、内嵌滚动条

1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相

2.页面源码如下:

<!DOCTYPE html>
<meta charset="UTF-8"> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html><head><style type="text/css">div.scroll{background-color:#afafaf;width:500px;height:100px;overflow:auto;}</style></head><body><p>个人微信公众号:yoyoketang</p><p>这是一个内嵌的div滚动条</p><div id="yoyoketang" name="yoyo" class="scroll">这是一个内嵌div:民国年间,九大家族镇守长沙,被称为“九门提督”。这九门势力庞大,外八行的无人不知,无人不
晓,几乎所有冥器,流出长沙必然经过其中一家。1933年秋,一辆神秘鬼车缓缓驶入长沙火车站,九门之首“张大佛爷”张启山身为布防官,奉命调查始末。张启山与八爷齐铁嘴一路探访,发现长沙城外有一座疑点重重的矿山,一直被日本人窥伺。
为破解矿山之谜,张启山求助同为九门上三门的戏曲名伶二月红,无奈二月红虽出身考古世家,却心系重病的妻子丫头,早已金盆洗手。张启山为了国家大义和手足之情,北上去往新月饭店为二月红爱妻求药。在北平,张启山邂逅了新月饭店的大小姐尹新月,并为尹新月连点三盏天灯,散尽家财。尹新月帮助张启山等人顺利返回
长沙,二人暗生情愫。二月红爱妻病入膏肓,服药后不见好转,最终故去。二月红悲伤之余却意外发现家族祖辈与矿山亦有重大关联,于是振作精神,决定与张启山联手,解开矿山之谜zhegedancihenchanghenchangchangchangchangchanchanchanchangchangchangchancg</div></body>
</html>

二、横向滚动

1.先通过id来定位,通过控制scrollLeft的值来控制滚动条高度

三、纵向滚动

1.这个是div的属性:<div id="yoyoketang" name="yoyo" class="scroll">

2.这里最简单的通过id来定位,通过控制 scrollTop的值来控制滚动条高度

3.运行下面代码,观察页面是不是先滚动到底部,过五秒再回到顶部。(get里面地址是浏览器打开该页面的地址)

四、用class属性定位

1.js用class属性定位,返回的是一个list对象,这里取第一个就可以了。
        2.这里要注意了,element和elements有很多小伙伴傻傻分不清楚。

5.JS处理多窗口

前言
在打开页面上链接的时候,经常会弹出另外一个窗口(多窗口情况前面这篇有讲解:Selenium2+python自动化13-多窗口、句柄(handle)),这样在多个窗口之间来回切换比较复杂,那么有没有办法让新打开的链接在一个窗口打开呢?
要解决这个问题,得从html源码上找到原因,然后修改元素属性才能解决。很显然js在这方面是万能的,于是本篇得依靠万能的js大哥了。

一、多窗口情况

1.在打baidu的网站链接时,会重新打开一个窗口
    (注意:我的百度页面是已登录状态,没登录时候是不会重新打开窗口的)

二、查看元素属性:target="_blank"

1.查看元素属性,会发现这些链接有个共同属性:target="_blank"

三、去掉target="_blank"属性

1.因为此链接元素target="_blank",所以打开链接的时候会重新打开一个标签页,那么解决这个问题,去掉该属性就可以了。
        2.为了验证这个问题,可以切换到html编辑界面,手动去掉“_blank”属性。

3.删除“_blank”属性后,重新打开链接,这时候会发现打开的新链接会在原标签页打开。

四、js去掉target="_blank"属性

1.第一步为了先登录,我这里加载配置文件免登录了(不会的看这篇:Selenium2+python自动化18-加载Firefox配置)
        2.这里用到js的定位方法,定位该元素的class属性
        3.定位到该元素后直接修改target属性值为空

五、代码如下:

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 加载配置文件免登录
profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'
profile = webdriver.FirefoxProfile(profileDir)
driver = webdriver.Firefox(profile)
driver.get("https://www.baidu.com/")
# 修改元素的target属性
js = 'document.getElementsByClassName("mnav")[0].target="";'
driver.execute_script(js)
driver.find_element_by_link_text("糯米").click()

注意:并不是所有的链接都适用于本方法,本篇只适用于有这个target="_blank"属性链接情况。

本篇仅提供解决问题的办法和思路,不要完全照搬代码!!!

6.JS 解决click失效问题

前言
有时候元素明明已经找到了,运行也没报错,点击后页面没任何反应。这种问题遇到了,是比较头疼的,因为没任何报错,只是click事件失效了。
本篇用2种方法解决这种诡异的点击事件失效问题

一、遇到的问题

1.在练习百度的搜索设置按钮时,点保存设置按钮,alert弹出没弹出(代码没报错,只是获取alert失败),相信不只是我一个人遇到过。

二、点击父元素

1.遇到这种问题,应该是前面操作select后导致的后遗症(因为我注释掉select那段是可以点击成功的)。
        2.第一种解决办法,先点击它的父元素一次,然后再点击这个元素。

3.代码如下:

三、js直接点击

1.遇到这种诡异问题,是时候出绝招了:js大法。
        2.用js直接执行点击事件。

四、代码如下:

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Firefox()
url = "https://www.baidu.com"
driver.get(url)
time.sleep(3)
mouse = driver.find_element("link text", "设置")
ActionChains(driver).move_to_element(mouse).perform()
time.sleep(3)
driver.find_element("link text", "搜索设置").click()
time.sleep(3)
s = driver.find_element("id", "nr")
Select(s).select_by_visible_text("每页显示50条")
# 方法一:先点父元素 交流QQ群:232607095
# driver.find_element("id", "gxszButton").click()
# driver.find_element("class name", "prefpanelgo").click()
# 方法二:用js直接去点击 交流QQ群:232607095
js = 'document.getElementsByClassName("prefpanelgo")[0].click();'
driver.execute_script(js)

7.18种定位方法献给大家

一、十八种定位方法

前八种是大家都熟悉的,经常会用到的

1.id定位:find_element_by_id(self, id_)
        2.name定位:find_element_by_name(self, name)
        3.class定位:find_element_by_class_name(self, name)
        4.tag定位:find_element_by_tag_name(self, name)
        5.link定位:find_element_by_link_text(self, link_text)
        6.partial_link定位find_element_by_partial_link_text(self, link_text)
        7.xpath定位:find_element_by_xpath(self, xpath)
        8.css定位:find_element_by_css_selector(self, css_selector)

这八种是复数形式

9.id复数定位find_elements_by_id(self, id_)
        10.name复数定位find_elements_by_name(self, name)
        11.class复数定位find_elements_by_class_name(self, name)
        12.tag复数定位find_elements_by_tag_name(self, name)
        13.link复数定位find_elements_by_link_text(self, text)
        14.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
        15.xpath复数定位find_elements_by_xpath(self, xpath)
        16.css复数定位find_elements_by_css_selector(self, css_selector)

这两种就是快失传了的

17.find_element(self, by='id', value=None)
        18.find_elements(self, by='id', value=None)

二、element和elements傻傻分不清

1.element方法定位到是是单数,是直接定位到元素
        2.elements方法是复数,这个学过英文的都知道,定位到的是一组元素,返回的是list队列

三、elements定位方法

1.这里重点介绍下用elements方法如何定位元素,当一个页面上有多个属性相同的元素时,然后父元素的属性也比较模糊,不太好定位。这个时候不用怕,换个思维,别老想着一次定位到,可以先把相同属性的元素找出来,取对应的第几个就可以了。

2.如下图,百度页面上有六个class一样的元素,我要定位“地图”这个元素。

3.取对应下标即可定位了。

四、代码如下:

# coding:utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 这里是定位的单个id
element = driver.find_element_by_id("kw")
print type(element)
print element
# 这里定位是多个class
elements = driver.find_elements_by_class_name("mnav")
print type(elements)
print elements
# 这里用的css语法
s = driver.find_elements("css selector", ".mnav")
# '地图'在第四个位置
print s[3].text
s[3].click()
# 这个写法也是可以的
# driver.find_elements("css selector", ".mnav")[3].click()
以上就是咱们这篇文章的干货啦!!!   谢谢大家的支持和鼓励,对大家有帮助就是对作者的最大支持!!!

selenium 后续来啦 ! ! !相关推荐

  1. selenium登录163邮箱,得到cookie,requests后续请求

    1.场景 很多时候登录操作是比较复杂的,因为存在各种反爆破操作,以及为了安全性提交数据都会存在加密.如果要完全模拟代码去实现登录操作是比较复杂,并且该网站后续更新了登录安全相关功能,那么登录的模拟操作 ...

  2. selenium破解滑块验证码自动查询+获取后续表单数据

    一.装载好chromedriver之后,运行命令行 "chrome.exe"(路径) --remote-debugging-port=9222 打开谷歌浏览器. 二.使用selen ...

  3. python+selenium浏览器常用操作(一)

    1.导入selenium自定义的webdriver.后续可通过调用此协议启动各大浏览器 from selenium import webdriver #浏览器 from selenium.webdri ...

  4. python selenium 等待页面加载完毕_Selenium_等待页面加载完毕

    隐式等待 WebDriver driver = newFirefoxDriver(); driver.get("www.baidu.com"); driver.manage().t ...

  5. Python 爬虫利器 Selenium 从入门到进阶

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编就来讲讲selenium,我们大致会讲这些内容 selenium简介与安装 页面元素的定位 浏览器的控制 鼠标的控制 键盘的控制 设置元素的等待 ...

  6. [Selenium] 操作浏览器 Cookies

    WebDriver 提供了一系列 Cookies 的操作来获取.填写.删除 Cookies 的方法,节省了多次在登陆页面的查找元素并填写登录信息的时间. 1)获取 Cookies ,并保存到文件中以备 ...

  7. linux配置selenium路径,Linux配置Selenium+Chrome+Python

    ---恢复内容开始--- 最近一个月没有更新博客了.最近都在复习LINUX与PYTHON知识.决定以后在LINUX环境下学习新知识. 包括后期的框架学习与平台知识方面. 直接记录今天下午的学习成果. ...

  8. python select模块安装_python+selenium select下拉选择框定位处理方法

    一.前言 总结一下python+selenium select下拉选择框定位处理的两种方式,以备后续使用时查询: 二.直接定位(XPath) 使用Firebug找到需要定位到的元素,直接右键复制XPa ...

  9. [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品

    在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...

最新文章

  1. 计算机应用为什么要学机械制图,机械制图为什么这么难学?
  2. 系统间通信——dubbo
  3. FTP下载文件中文名乱码FTP访问
  4. git 怎么拉取线上代码到本地进行合并_android studio如何使用git提交、拉取、合并代码的操作...
  5. centos7 svn自动更新至web目录
  6. 性能测试利器 - Locust框架解析
  7. 论文笔记_S2D.66_ICRA_2021_LVI-SAM: 紧耦合的激光视觉惯导SLAM系统
  8. 小爱同学app安卓版_小爱同学app下载-小米小爱同学下载2.9.21安卓版-西西软件下载...
  9. python3爬虫教程
  10. mapabc 地图失效不能进行任何操作
  11. 【转】武大张卢腾448分考研真实经历
  12. SpringCloud 统一网关Gateway -- 为什么需要网关、Gateway快速入门、路由断言工厂(Route Predicate Factory)
  13. My concerns
  14. Linux内核中的延时函数详解
  15. 可以把JPG图片转成PDF的格式转换器
  16. 河南大学计算机学院吴哲2008年,计算机与信息工程学院86级校友荣归母校
  17. 新零售如何做到线上线下相结合?
  18. Eclipse插件2
  19. 每日一数——梅森数(Mersenne number)
  20. 交通银行计算机设备实物管理,酷!AI助力交通银行提升风险管理能力

热门文章

  1. RK3588S Andriod12调试OLED屏幕背光
  2. CAD填充技巧:CAD软件中竟然可以无边界填充!
  3. mac下mysql的DMG格式安装卸载方法
  4. 【无标题】2022年10月22日 20点 程序爱生活 纳指和恒指反弹的概率还在,但是反弹做空为主。敏感因子第一次出现折价缩小,或许春天不太远,还需要观察!
  5. Java设计一个简化的教师年终业绩考核系统
  6. windows进程管理器_面向Windows,Linux,Mac ,安卓, 木马,密码破解内存提取基于KPCR结构的技术研究...
  7. 快来看看这三款好用的数据可视化软件哪个戳中了你的心巴
  8. 用python实现五子棋游戏下载_python实现五子棋小游戏
  9. 泡泡龙——代码结构规范
  10. Python学习笔记024