1. 程式人生 > >1105Selenium web自動化測試經驗分享-CSS定位總結

1105Selenium web自動化測試經驗分享-CSS定位總結

最近重拾web自動化測試的知識,打算寫個QQ郵箱的指令碼練練手,之後全心去搞Jmeter。今天先分享下自己整理的CSS定位的一些知識。

一)CSS定位

CSS(Cascading Style Sheets)是一種語言,它用來描述HTML和XML的元素顯示樣式;在CSS語言中有CSS選擇器(不同的策略選擇元素),在Selenium中也可以使用這種選擇器。

提示:
1. 在selenium中推薦CSS定位,因為它比XPath定位速度要快
2. css選擇器語法非常強大,又比較繁瑣,所以需要多多練習

方法 driver.find_element_by_css_selector()

二)CSS定位總結

部分例子是用的百度-那個搜尋框,方便操作和理解。
其中有一行註釋 是我當時定位搜尋框的屬性。另外,為了除錯時方便看到輸入的結果,我在每個用例後面都增加了強制等待1秒。

1.CSS定位之 id屬性

根據元素id屬性來定位–#id

    def test_24(self):
        """css 用#號來表示id屬性"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")
        
        # <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
        
        driver.find_element_by_css_selector('#kw').send_keys('python')

        time.sleep(1)
        driver.quit()

2.CSS定位之 class屬性

根據元素class屬性來選擇–.class [可以記做:點class]

    def test_25(self):
        """css 用.來表示class屬性"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")
        
        # <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">

        driver.find_element_by_css_selector('.s_ipt').send_keys('python')

        time.sleep(1)
        driver.quit()

3.CSS定位之 元素的屬性名和值

根據元素的屬性名和值----[attribute=‘value’]

    def test_27(self):
        """css 根據元素的屬性名和值來選擇 格式:[attribute=value]
        如:[type="password"] <選擇所有type屬性值為password的元素>"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")
        
        # <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">

        driver.find_element_by_css_selector('[id="kw"]').send_keys('python')
        driver.find_element_by_css_selector('[class="s_ipt"]').send_keys('python')
        driver.find_element_by_css_selector('[autocomplete="off"]').send_keys('python')
        driver.find_element_by_css_selector('[name="wd"]').send_keys('python')

        time.sleep(1)
        driver.quit()

4.CSS定位之 標籤名+元素的屬性名和值

標籤名 與 屬性名和值的 組合來定位----tag_name[attribute=‘value’]
但是id和class屬性比較特殊,實際寫法----tag_name#id、tag_name.class

    def test_28(self):
        """css 用標籤與 屬性名和值 組合 來定位"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")

        # <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">

        driver.find_element_by_css_selector('input.s_ipt').send_keys('python')
        driver.find_element_by_css_selector('input#kw').send_keys('python')
        time.sleep(2)

        driver.find_element_by_css_selector('input[autocomplete="off"]').clear()
        time.sleep(1)
        driver.find_element_by_css_selector('input[name="wd"]').send_keys('python')
        driver.find_element_by_css_selector('input[id="kw"]').send_keys('python')
        driver.find_element_by_css_selector('input[class="s_ipt"]').send_keys('python')

        time.sleep(1)
        driver.quit()

5.CSS定位之 層級關係

最好使用>代替空格 來代表層級關係----tag1>tag2

    def test_29(self):
        """css 用層級關係 來定位"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")

        # <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> 子
        # <span id="s_kw_wrap" class="bg s_ipt_wr quickdelete-wrap"> 父
        # <form id="form" name="f" action="/s" class="fm"> 爺

        # 爺爺定位孫子
        driver.find_element_by_css_selector('form#form>span>input').send_keys('python')
        driver.find_element_by_css_selector('form.fm>span>input').send_keys('python')

        # 父定位子
        driver.find_element_by_css_selector('span.quickdelete-wrap>input').send_keys('python')
        driver.find_element_by_css_selector('span.s_ipt_wr>input').send_keys('python')

        time.sleep(1)
        driver.quit()

6.CSS定位之 邏輯運算

1.邏輯運算----無需寫and關鍵字----tag_name[attribute1=‘value1’][attribute2=‘value2’]
2.邏輯運算----不見得 非加標籤名----[attribute1=‘value1’][attribute2=‘value2’]

    def test_30(self):
        """css 用邏輯運算來定位,同時匹配兩個屬性,這裡跟xpath不一樣,無需寫and關鍵字[不見得 加標籤名]"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")

        # <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">

        # 有tag_name
        driver.find_element_by_css_selector('input[id="kw"][class="s_ipt"]').send_keys('python')
        driver.find_element_by_css_selector('input[id="kw"][name="wd"]').send_keys('python')
        driver.find_element_by_css_selector('input[autocomplete="off"][name="wd"]').send_keys('python')
        time.sleep(2)

        # 沒有tag_name
        driver.find_element_by_css_selector('[id="kw"][name="wd"]').clear()
        time.sleep(1)
        driver.find_element_by_css_selector('[id="kw"][class="s_ipt"]').send_keys('python')
        driver.find_element_by_css_selector('[autocomplete="off"][name="wd"]').send_keys('python')

        time.sleep(1)
        driver.quit()

7.CSS定位之模糊定位

1.模糊匹配----tag[attribute^=“p”] 說明:attribute屬性以p字母開頭的元素.
----tag[attribute$=“p”] 說明:attribute屬性以d字母結束的元素
----tag[attribute*=“p”] 說明:attribute屬性包含w字母的元素

2.模糊匹配–[不加標籤名]----[attribute^=‘v’]
[不加標籤名]----[attribute$=‘v’]
[不加標籤名]----[attribute*=‘v’]

    def test_31(self):
        """css模糊匹配"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")

        # 有tag_name
        driver.find_element_by_css_selector('input[autocomplete^="of"]').send_keys('python')
        driver.find_element_by_css_selector('input[autocomplete$="f"]').send_keys('python')
        driver.find_element_by_css_selector('input[autocomplete*="o"]').send_keys('python')
        time.sleep(2)

        # 沒有tag_name
        driver.find_element_by_css_selector('[autocomplete^="of"]').clear()
        time.sleep(1)
        driver.find_element_by_css_selector('[autocomplete$="f"]').send_keys('python')
        driver.find_element_by_css_selector('[autocomplete*="o"]').send_keys('python')

        time.sleep(1)
        driver.quit()

8.CSS定位之 索引定位

先定位父類再來定位子類,
tag1[attribute=“value”]>tag2:nth-child(1)、tag1[attribute=“value”]>tag2:nth-child(2)

請留意tag:nth-child()
nth-child() 是小括號
索引是從1開始,是當前tag在所有tag的順序排的

    def test_31b2(self):
        """css 層級關係、 索引"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(10)
        driver.get("https://passport.csdn.net/account/login")
        driver.find_element_by_link_text('賬號登入').click()
        time.sleep(2)

        # 使用者名稱 父類form下的第2個
        driver.find_element_by_css_selector('form[id="fm1"]>input:nth-child(2)').send_keys('python')
        time.sleep(0.5)
        driver.find_element_by_css_selector('form[method="post"]>*:nth-child(2)').clear()

        # 兄弟節點定位--這裡也是css selector的一個痛點,因為css的設計不允許有子元素能夠獲取父節點的辦法(至少目前沒有)

        # 密碼 父類form下的第4個
        driver.find_element_by_css_selector('div[class="user-pass"]>form>input:nth-child(4)').send_keys('python')
        time.sleep(0.5)
        driver.find_element_by_css_selector('div[class="user-info"]>div[class="user-pass"]>form>*:nth-child(4)').clear()

        # 登入按鈕 父類form下的第12個
        driver.find_element_by_css_selector('form[id="fm1"]>:nth-child(12)').click()

        time.sleep(2)
        driver.quit()

9.CSS定位之 其他

標籤頁定位
格式:tag_name 如:input <選擇所有input元素> 極不推薦!!!

    def test_26(self):
        """css 用標籤名來定位,不推薦"""
        driver = webdriver.Chrome()
        driver.implicitly_wait(5)
        driver.get("https://www.baidu.com")

        # input <選擇所有input元素>
        print(len(driver.find_elements_by_css_selector('input')))       # 列印input標籤總數量

        time.sleep(1)
        driver.quit()

一點經驗

若某元素的class屬性值如果有多個,可以使用driver.find_element_css_selector(’.class1.class2.class3’), 這是同時用到了.class和邏輯運算。

20181108第二次修改:補充了標籤頁定位、索引定位的程式碼,同時新掉進、爬出好幾個坑。

CSS定位中 兄弟節點定位(子定位父) 沒有實現!
索引定位的數字是全部tag裡面的排序,非那類tag的排序。

交流技術 歡迎+QQ 153132336 zy
歡迎關注 微信公眾號:紫雲小站