Selenium之table操作
操作内容:
获取table总行数、总列数、获取某单元格的text值,删除一行【如果每行后边提供删除的按钮】
HTML代码:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<script type="text/javascript">
function deleteRow(tableID, obj) {//参数为表格ID,触发对象
//获得触发对象的行号,parentElement的个数取决于触发对象为TR的第几级子项,input=>td=>tr,所以parentElement有两个
var rowIndex = obj.parentElement.parentElement.rowIndex;
//var table = document.getElementById(tableID).deleteRow(rowIndex);
alert("您确定要删除吗?")
obj.parentElement.parentElement.parentElement.deleteRow(rowIndex); //再简化:省略tableID参数
}
</script>
<table border="1" id="tab1" width="90%">
<tbody>
<tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
<th>身份证</th>
<th>删除</th>
</tr>
<tr>
<td style="text-align: center;">1</td>
<td >测试一</td>
<td>15</td>
<td>1111111111111111111</td>
<td name="sc" style="text-align: center;"><input
type="button" value="删除" onclick="deleteRow('tb',this)"/></td>
</tr>
<tr>
<td style="text-align: center;">2</td>
<td>测试二</td>
<td>20</td>
<td>2222222222222222222</td>
<td name="sc" style="text-align: center;"><input
type="button" value="删除" onclick="deleteRow('tb',this)"/></td>
</tr>
<tr>
<td style="text-align: center;">3</td>
<td>测试三</td>
<td>20</td>
<td>3333333333333333333</td>
<td name="sc" style="text-align: center;"><input
type="button" value="删除" onclick="deleteRow('tb',this)"/></td>
</tr>
<tr>
<td style="text-align: center;">4</td>
<td>测试四</td>
<td>20</td>
<td>4444444444444444444</td>
<td name="sc" style="text-align: center;"><input
type="button" value="删除" onclick="deleteRow('tb',this)"/></td>
</tr>
</tbody>
</table>
</body>
</html>
拷贝上述代码保存为table.html,打开页面出现乱码的解决方法:
1) html4: <meta http-equiv="content-type" content="text/html;charset=utf-8">
2) html5: <meta charset=utf-8>
Python代码:
# -*- coding: utf-8 -*-
from selenium import webdriver
import os, time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC file_path = os.path.abspath('table.html')
driver = webdriver.Chrome()
driver.get(file_path)
table = driver.find_element_by_id('tab1') # table的总行数,包含标题
table_rows = table.find_elements_by_tag_name('tr')
print(u"总行数:", len(table_rows)) # table的总列数
'''
在table中找到第一个tr,之后在其下找到所有的th,即是table的总列数
'''
table_cols = table_rows[0].find_elements_by_tag_name('th')
print(u"总列数:", len(table_cols)) # 获取某单元格的text:获取第一行第二列的text,[不算标题行]
row1_col2 = table_rows[1].find_elements_by_tag_name('td')[1].text
print(u"第一行第二列的text:", row1_col2) # 删除最后一行
table_rows[-1].find_element_by_tag_name('input').click()
time.sleep(2)
driver.switch_to.alert.accept()
time.sleep(2) #检查是否删除成功
'''
解释:text_to_be_present_in_element实际是一个类,由于添加了__call__方法,它的实例也可以调用
作用:检查指定元素上的文本是否符合预期 检查是否成功的思路
1.删除的是最后一行,也就是序号为'4'的那行,所以只要检查整个table中是否还有‘4’即可,如果返回false,说明删除成功,前提条件是table中的其他单元格内容均不包含‘4’
【如果其他单元格中的内容包含‘4’,返回True,显然检查结果是不正确的,所以此处要检查的预期值必须在table中是唯一的,比如用身份证】
2.检查table中最后一行的序号是不是‘4’,如果不是,则说明删除成功
3.通过检查table的行数来判断
''' #第一种检查
expected_4 = EC.text_to_be_present_in_element((By.XPATH, '//*[@id="tab1"]'),'4')
if expected_4 == False:
print('第一种检查:删除成功')
time.sleep(2) # 第二种检查
expected_4 = EC.text_to_be_present_in_element((By.XPATH,'//*[@id="tab1"]/tbody/tr[4]/td[1]'),'4')
if expected_4(driver) != True:
print('第二种检查:删除成功') #第三种检查
table_rows_sc = table.find_elements_by_tag_name('tr')
print(len(table_rows_sc))
if len(table_rows_sc) == len(table_rows)-1:
print('第三种检查:删除成功')
Selenium之table操作的更多相关文章
- Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- table 操作
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】
删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCAD ...
- mysql批量进行optimize table操作
数据库运行一段时间后,有可能会有磁盘磁片产生,此时我们需要进行optimize table操作 # 获取需要optimize的表:如下为获取总大小小于80G的表进行操作:mysql -utroot - ...
- selenium + python(鼠标操作)
关于最近学习selenium自动化测试鼠标操作的一些总结 常见的鼠标操作
- selenium鼠标悬停操作
有些网页一打开会有一个弹窗,弹窗不消失无法进行取元素操作,只有把鼠标悬停在上面弹窗才会消失,这时就用到了selenium的悬停操作 鼠标悬停 move_to_element() 定位到要悬停的元素 ...
- MySQL DROP TABLE操作以及 DROP 大表时的注意事项
语法: 删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CA ...
- openresty开发系列19--lua的table操作
openresty开发系列19--lua的table操作 Lua中table内部实际采用哈希表和数组分别保存键值对.普通值:下标从1开始 不推荐混合使用这两种赋值方式. local color={fi ...
- selenium窗口截图操作
selenium窗口截图操作 使用背景:在自动化测试过程中,可能遇到执行错误情况,那么怎么样及时捕获出错信息/界面? 可以使用 get_screenshot_as_file(self,filenam ...
随机推荐
- java8实战一------解决冗杂,java8真的很便利(抛砖)
你的代码很容易因为需求而变化,对自己代码改来改去的你一定会觉得烦的.在我看来,java8很容易的解决了这个问题. 先来看看例子!在一堆苹果里,筛选绿色的苹果.当然,Apple类是这样子. class ...
- pc端结合canvas实现简单签名功能
需求:业务员做提交时要签名... 代码不多简单易懂,直接看代码 <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- Docker 容器技术
前言: 之前感觉Docker是一种小虚拟机,docker和KVM虚拟机之间有什么区别.联系.可以应用在什么样的生产环境? 一.Docker是什么以及和KVM的区别 1.docker概念? Docker ...
- test--2
$(function () { if (isLogined && !c_has_follwed) { $.ajax({ url: "/mvc/Follow/Fol ...
- 怎么在多场景下使用不同的 git 账号 commit
应用场景 我有多个github的账号,不同的账号对应不同的repo,需要push的时候自动区分账号 我有多个git的账号,有的是github的,有的是单位的gitlab的,不同账号对应不同的repo, ...
- Jmeter之https脚本录制
jmeter录制脚本时,跟http脚本录制主要区别是,https录制需要添加安全证书. 一.jmeter代理服务器及证书配置. 1.打开jmeter,右键测试计划添加线程组,右键工作台--> ...
- mvc route .html 后缀 404
<system.webServer> <validation validateIntegratedModeConfiguration="false" /&g ...
- 使用HM16.0对视频编码
1.编译HM16.0源码: 步骤参照:https://www.vcodex.com/hevc-and-vp9-codecs-try-them-yourself/(可设置pq等参数) [编译过程中遇到l ...
- 使用Spark进行搜狗日志分析实例——map join的使用
map join相对reduce join来说,可以减少在shuff阶段的网络传输,从而提高效率,所以大表与小表关联时,尽量将小表数据先用广播变量导入内存,后面各个executor都可以直接使用 pa ...
- 命令提示符出现-bash-4.1$如何解决
故障原因:用户模式/etc/skel内容丢失 解决方法 复制etc/skel里内容到当前用户 [root@web01 ~]# su - test -bash-4.1$ cp /etc/skel/.ba ...