python selenium自动化点击页面链接测试
python selenium自动化点击页面链接测试
需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回到原始页面。
要完成这个需求就必须实现3点:
1. 找到原始页面上面所有的在本窗口内跳转的链接
2. 跳转到目标页面之后,“后退”到原始页面
3. 在原始页面上继续点击后续的链接
首先,要找到页面上的所有链接并不困难。selenium为我们提供了find_elements_by_tag_name方法。我们只需要在初始化webdriver之后,调用
driver.find_elements_by_tag_name("a") 
就能找到页面上的所有a标签。
我们可以对所有的a标签进行点击,但是这样的话我们不能保证所有的a标签所指向的目标页面都是站内的,有可能目标是其他的站外网页;另外这样也不能保证该跳转页面是在本窗口跳转而不是新开一个窗口。
解决办法:
使用selenium.webdriver.remote.webelement.WebElement提供的get_attribute方法。
通过get_attribute拿到该a标签的各种属性,通过判断找到符合要求的元素进行点击。
get_attribute("href") 得到a标签对应的目标页面的URL,对URL进行判断就可以了解到该页面是否站内页面。我们可以知道,如果是站内页面的话这个属性一般会是一个相对路径,或者包含了本站域名,但如果是站外页面的话,那它一定是包含了“http”的一个url。
get_attribute("target")如果target不是"_blank"的话,可以判断该页面是在本窗口跳转的。
跳转到下一页面后如何返回原始页面呢?
selenium webdriver 提供了back方法可以轻松的达到这个目标:driver.back()
最后,需要在返回了原始页面之后继续点击下一个链接进行测试,这个不用说肯定要使用for loop:
for i in range(0, len(driver.find_elements_by_tag_name("a"))):
在python中,如果我们指定i在range(0, x)中循环时,会以1为步长来遍历从0到(x-1)的序列。例如:range(0,5)会得到[0, 1, 2, 3, 4]。当我们想更改range的步长时,则需要为range方法提供第三个参数。例如:range(0,5,2),则会以2为步长,得到[0,2,4]这个序列。
另外,我们也可以使用类似C#中foreach的方法:
for targetLink in driver.find_elements_by_tag_name("a"):
这种方法同样可以遍历所有的a标签集合中的所有元素。
如果使用第二种方法,我们觉得这个需求可以简单的实现为:

links = driver.find_elements_by_tag_name("a")
for link in links:
     if not "_blank" in link.get_attribute("target") and ("google" in link.et_attribute("href") or not "http" in link.get_attribute("href")):
          link.click()
          driver.back()

但是这样的实现在运行时会抛出异常:
selenium.common.exceptions.StaleElementReferenceException: Message: u'Element not found in the cache - perhaps the page has changed since it was looked up'
异常的说明已经很明显了:在cache中找不到元素,在元素被找到之后页面变换了。 这就说明,当当前页面发生跳转之后,存在cache中的关于这个页面的元素也被清空了。
因此,我们需要在每次回到原始页面之后对我们感兴趣的a标签元素重新搜索,同时我们又必须接着上次的点击到的元素继续点击。因此我们使用第一种遍历的方法来实现这个for loop:

length = len(driver.find_elements_by_tag_name("a")
for i in range(0,length):
    links = driver.find_elements_by_tag_name("a")
    link = links[i]
    if not ("_blank" in link.get_attribute("target") or "http" in link.get_attribute("href")):
        link.click()
        driver.back()

这样,在每次返回页面之后会重新搜索一遍页面上的a元素,然后使用cache中的i继续点击下一个跳转链接。
python selenium自动化点击页面链接测试的更多相关文章
- selenium 点击页面链接测试
		
点击页面链接测试 http://www.51testing.com/html/21/n-862721.html 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口 ...
 - python+selenium:点击页面元素时报错:WebDriverException: Message: Element is not clickable at point (1372.5, 9.5). Other element would receive the click: <li style="display: list-item;" id="tuanbox"></li>
		
遇到一个非常郁闷的问题,终于解决了, 问题是这样的,NN网站的价格计划,每一个价格计划需要三连击才能全部点开,第一个房型的价格计划是可以正确三连击打开的,可是第二个房弄就不行了,报错说不是可点击的 ...
 - python selenium自动化(一)点击页面链接测试
		
需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回到原始页面. 要完成这个需求就必须实现3点: 1. 找 ...
 - selenium 自动化点击页面
		
#!/usr/bin/env python# -*- coding:utf-8 -*-from selenium import webdriverfrom selenium.webdriver.com ...
 - python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]
		
背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...
 - Python+Selenium自动化-定位页面元素的八种方法
		
Python+Selenium自动化-定位页面元素的八种方法 本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...
 - Python+Selenium自动化-清空输入框、输入内容、点击按钮
		
Python+Selenium自动化-清空输入框.输入内容.点击按钮 1.输入内容 send_keys('valve'):输入内容valve #定位输入框 input_box = browser. ...
 - Python+Selenium自动化-设置浏览器大小、刷新页面、前进和后退
		
Python+Selenium自动化-设置浏览器大小.刷新页面.前进和后退 1.设置浏览器大小 maximize_window():设置浏览器大小为全屏 set_window_size(500,5 ...
 - Python+Selenium自动化-获取页面信息
		
Python+Selenium自动化-获取页面信息 1.获取页面title title:获取当前页面的标题显示的字段 from selenium import webdriver import t ...
 
随机推荐
- C/C++  运算符优先级(转载)
			
最讨厌这个了.在这里记录下. 优先级 操作符 描述 例子 结合性 1 ()[]->.::++-- 调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的 ...
 - vbox 虚拟机添加usb
			
先装扩展包. vbox 所在的用户组比如要包括当前用户才行. 查看当前用户名:sharl@sharl-laptop:~$ whoamisharl 查看vbox 所在的组:sharl@sharl-lap ...
 - NOIP2018复赛获奖分数线及名额分配办法
			
中国计算机学会CCF NOI科学委员会.竞赛委员会召开会议,确定了CCF NOIP2018复赛获奖分数线及获奖名额分配方案. 提高组一等奖名额分配方案 提高组一等奖全国基准分数线: 245分 CCF ...
 - Introduction to Cryto & Crptocurrencies Lecture 1
			
Lecture 1.2 Hash Pointer & Data Structure Use Case 1. 什么是Block Chain呢? 想象一个像链表一样的结构,只不过与通常的指向下一块 ...
 - linux:NFS
			
1.简介 2.安装 安装分为服务端和客户端 [1]我们先拿一台机做服务端 yum install nfs-utils rpcbind -y 然后我们查查看安装没有,查询一个包是否被安装# rpm -q ...
 - CSS--思维导图
			
CSS--思维导图
 - block,inline-block,行内元素区别及浮动
			
1.block: 默认占据一行空间,盒子外的元素被迫另起一行 2.inline-block: 行内块盒子,可以设置宽高 3.行内元素: 宽度即使内容宽度,不能设置宽高,如果要设置宽高,需要转换成行内块 ...
 - SQL-19 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
			
题目描述 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工CREATE TABLE `departments` (`dept_no` c ...
 - java构造函数使用方法总结 (继承与构造函数)
			
使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...
 - how to istall virtualbox on centos
			
https://tecadmin.net/install-oracle-virtualbox-on-centos-redhat-and-fedora/