1. 程式人生 > >Selenium之table操作

Selenium之table操作

拷貝 操作內容 table time IT span dex meta 刪除

操作內容:

獲取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操作