Selenium處理常見web控件-table

Selenium沒有提供table的處理方法靶擦,只有根據(jù)需要自己編寫腳本核偿。主要思路是通過xpath下標(biāo)和css selector層級(jí)的方式迹缀,通過循環(huán)實(shí)現(xiàn)根據(jù)行列取數(shù)據(jù)瓦糕,根據(jù)數(shù)據(jù)判斷所在的行列。
一個(gè)簡單的table示例:

<html>
<head>
    <meta charset="UTF-8">
    <title>Table</title>
</head>
<body>
<table border="1" id="myTable">
    <tbody>
        <tr>
            <th>表頭第一格</th>
            <th>表頭第二格</th>
            <th>表頭第三格</th>
        </tr>
        <tr>
            <td>第一行第一列</td>
            <td>第一行第二列</td>
            <td>第一行第三列</td>
        </tr>
        <tr>
            <td>第二行第一列</td>
            <td>第二行第二列</td>
            <td>第二行第三列</td>
        </tr>
    </tbody>
</table>
</body>
</html>

大致是這樣一個(gè)表格:


table簡單示例

根據(jù)行列取文本值

def row_cell_get_table_text(driver, locator, row, cell):
    """
    根據(jù)輸入的行列值款筑,獲取該行列單元格中的文本智蝠。
    :param locator: 定位到table的定位語句
    :param row: 行
    :param cell: 列
    :return: 單元格文本
    """
    locator = "%s/tbody/tr[%s]/td[%s]" % (locator, row + 1, cell)
    text = driver.find_element_by_xpath(locator).text
    return text
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('file:///E:/table.html')
locator = "http://table[@id='myTable']"
row_cell_get_table_text(driver, locator, 2, 2)
# '第二行第二列'

根據(jù)文本獲取所在的行列

方法1:
使用xpath方式腾么,先獲取整個(gè)列表的tr行數(shù),然后獲取所有的td數(shù)杈湾,tr/rd就是列數(shù)解虱。根據(jù)行列去遍歷整個(gè)列表,返回匹配的文本所在的行列毛秘。

def text_get_table_row_cell(driver, locator, text):
    """通過xpath定位的方式饭寺,根據(jù)參數(shù)text中的文本返回文本所在的行列"""

    # 獲取行數(shù),由于部分表格表頭是用th而不是用td叫挟,可能會(huì)出現(xiàn)計(jì)算錯(cuò)誤艰匙。因此這里先除去表頭
    table_tr = driver.find_elements_by_xpath(locator + "/tbody/tr")[1:]
    row = len(table_tr)

    # 獲取列數(shù)
    table_td = driver.find_elements_by_xpath(locator + "/tbody/tr/td")
    cell = int(len(table_td) / row)

    # 遍歷table中的所有文本,并匹配的值返回所在的行列
    # xpath中下標(biāo)取值從1開始抹恳,除去表頭员凝,需要從2開始
    for i in range(2, row + 2):
        for j in range(1, cell + 1):
            tl = locator + "/tbody/tr[" + str(i) + "]/td[" + str(j) + "]"
            table_text = driver.find_element_by_xpath(tl).text
            if text == table_text:
                return i, j
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('file:///E:/table.html')
locator = "http://table[@id='myTable']"
text_get_table_row_cell(driver,locator,'第一行第二列')
# (2, 2)
# 注意,這里算上表頭是第二行奋献,可以根據(jù)需要減1.

方法2:
通過css的方式健霹,先查找到所有table內(nèi)部的tr元素,再找tr內(nèi)部的所有td標(biāo)簽瓶蚂。同樣遍歷整個(gè)table糖埋,獲取文本所在的行列。

def text_get_table_row_cell_by_css(driver, csslocator, text):
    """通過css定位的方式窃这,根據(jù)參數(shù)text中的文本返回文本所在的行列瞳别,排除了表頭的情況"""
    # 拼接定位語句
    locator = csslocator + ">tbody>tr"

    # 去表頭
    table_tr_list = driver.find_elements_by_css_selector(locator)[1:]

    # 遍歷table中的所有文本
    for tr in range(len(table_tr_list)):
        # 查找當(dāng)前tr中的所有td
        table_td_list = table_tr_list[tr].find_elements_by_tag_name("td")
        for td in range(len(table_td_list)):
            if text == table_td_list[td].text:
                return tr + 1, td + 1
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('file:///E:/table.html')
locator = "#myTable"
text_get_table_row_cell_by_css(driver,locator,'第二行第三列')
# (2, 3)
# 這里排除了表頭的情況,如果需要杭攻,再加1.

現(xiàn)在表格可能會(huì)加多種樣式等情況祟敛,需要根據(jù)實(shí)際測試的頁面表格情況靈活調(diào)整。
再封裝一下兆解,封裝成一個(gè)類:

__author__ = "Nemo"
# =========================================
#     用來處理列表頁中的table
# =========================================


class Table(object):

    def __init__(self, driver):
        self.driver = driver

    def row_cell_get_table_text(self, locator, row, cell):
        """
        根據(jù)輸入的行列值馆铁,獲取該行列單元格中的文本。
        :param locator: 定位到table的定位語句
        :param row: 行
        :param cell: 列
        :return: 單元格文本
        """
        locator = "%s/tbody/tr[%s]/td[%s]" % (locator, row+1, cell)
        text = self.driver.find_element_by_xpath(locator).text
        return text

    def text_get_table_row_cell(self, locator, text):
        """通過xpath定位的方式锅睛,根據(jù)參數(shù)text中的文本返回文本所在的行列埠巨,排除了表頭的情況"""

        # 獲取行數(shù),除去表頭
        table_tr = self.driver.find_elements_by_xpath(locator + "/tbody/tr")[1:]
        row = len(table_tr)

        # 獲取列數(shù)
        table_td = self.driver.find_elements_by_xpath(locator + "/tbody/tr/td")
        cell = int(len(table_td)/row)

        # 根據(jù)行列數(shù)遍歷table中的所有文本衣撬,并獲取匹配的文本所在的行列
        for i in range(2, row + 2):
            for j in range(1, cell + 1):
                tl = locator + "/tbody/tr[" + str(i) + "]/td[" + str(j) + "]"
                table_text = self.driver.find_element_by_xpath(tl).text
                if text == table_text:
                    return i, j

    def text_get_table_row_cell_by_css(self, csslocator, text):
        """通過css定位的方式乖订,根據(jù)參數(shù)text中的文本返回文本所在的行列,排除了表頭的情況"""

        locator = csslocator + ">tbody>tr"

        # 去表頭
        table_tr_list = self.driver.find_elements_by_css_selector(locator)[1:]

        # 遍歷table中的所有文本
        for tr in range(len(table_tr_list)):
            table_td_list = table_tr_list[tr].find_elements_by_tag_name("td")
            for td in range(len(table_td_list)):
                if text == table_td_list[td].text:
                    return tr + 1, td + 1
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('file:///E:/table.html')
table = Table(driver)
css_locator = "#myTable"
xpath_locator = "http://table[@id='myTable']"

table.row_cell_get_table_text(xpath_locator, 2, 2)
# '第二行第二列'
table.text_get_table_row_cell(xpath_locator, '第一行第二列')
# (2, 2)
table.text_get_table_row_cell_by_css(css_locator , '第二行第三列')
# (2, 3)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末具练,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甜无,更是在濱河造成了極大的恐慌扛点,老刑警劉巖哥遮,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異陵究,居然都是意外死亡眠饮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門铜邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仪召,“玉大人,你說我怎么就攤上這事松蒜∪用” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵秸苗,是天一觀的道長召娜。 經(jīng)常有香客問我,道長惊楼,這世上最難降的妖魔是什么玖瘸? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮檀咙,結(jié)果婚禮上雅倒,老公的妹妹穿的比我還像新娘。我一直安慰自己弧可,他們只是感情好蔑匣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侣诺,像睡著了一般殖演。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上年鸳,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天趴久,我揣著相機(jī)與錄音,去河邊找鬼搔确。 笑死彼棍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膳算。 我是一名探鬼主播座硕,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涕蜂!你這毒婦竟也來了华匾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤机隙,失蹤者是張志新(化名)和其女友劉穎蜘拉,沒想到半個(gè)月后萨西,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旭旭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年谎脯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片持寄。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡源梭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稍味,到底是詐尸還是另有隱情废麻,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布仲闽,位于F島的核電站脑溢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赖欣。R本人自食惡果不足惜屑彻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顶吮。 院中可真熱鬧社牲,春花似錦、人聲如沸悴了。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湃交。三九已至熟空,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搞莺,已是汗流浹背息罗。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留才沧,地道東北人迈喉。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像温圆,于是被迫代替她去往敵國和親挨摸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案岁歉? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • 開始注意是因?yàn)槲恼碌拿值迷恕:髞砜次闹懒耸桥鲀?nèi)心的inner peace. 寫權(quán)謀,不夠老辣。不過溫暖澈圈。另彬檀,這個(gè)...
    葉開開閱讀 222評(píng)論 0 0
  • 從去年10月份開始,一直到現(xiàn)在努潘,裝修還沒有完結(jié)诽偷。從一開始的興致勃勃,到現(xiàn)在已經(jīng)接近心死疯坤。期間種種幾乎出離言語报慕。頂多...
    蔣菱閱讀 510評(píng)論 0 0
  • 一念秋風(fēng)起,落葉簌簌压怠。 天藍(lán)的讓我忘記想你眠冈。心中的快意是那樣酣暢淋漓。這個(gè)秋日菌瘫,空曠明凈蜗顽,高而深遠(yuǎn)。美好的讓人不忍...
    一剪芳蹤閱讀 709評(píng)論 0 3
  • 作者:朱金燦來源:http://blog.csdn.net/clever101 這個(gè)問題很普遍雨让。最近在研究這個(gè)問題...
    舌尖上的大胖閱讀 1,796評(píng)論 0 3