1. 程式人生 > >Web自動化 - 選擇操作元素 2

Web自動化 - 選擇操作元素 2

tutorial data- 語法 開發 drive 看到了 OS CP 運用

文章轉自 白月黑羽教Python

前面我們看到了根據 id、class屬性、tag名 選擇元素。

如果我們要選擇的 元素 沒有id、class 屬性, 這時候我們通常可以通過 CSS selector 語法選擇元素。

CSS Selector 語法選擇元素

HTML中經常要 為 某些元素 指定顯示風格,比如 前景文字顏色是紅色, 背景顏色是黑色, 字體是微軟雅黑等。

那麽CSS必須告訴瀏覽器:要 選擇哪些元素 , 來使用這樣的顯示風格。

CSS Selector 語法就是用來選擇元素的。

既然它能選擇元素,正好我們web 自動化也要選擇元素, 所以selenium規範就把 CSS Selector 也納入到選擇元素的方法中了。

只要 CSS Selector 的語法是正確的, Selenium 就可以選擇到該元素。

通過 CSS Selector 選擇單個元素的方法是

find_element_by_css_selector(CSS Selector參數)

選擇所有元素的方法是

find_elements_by_css_selector(CSS Selector參數)

CSS Selector 選擇元素非常靈活強大, 大家可以從下面的例子看出來。

Web自動化 - 選擇操作元素 2

本文目錄

  • CSS SELECTOR 語法選擇元素
    • 根據 TAG名、ID、CLASS 選擇元素
    • 選擇 子元素 和 後代元素
    • 混合運用
    • 驗證 CSS SELECTOR

前面我們看到了根據 id、class屬性、tag名 選擇元素。

如果我們要選擇的 元素 沒有id、class 屬性, 這時候我們通常可以通過 CSS selector 語法選擇元素。

CSS Selector 語法選擇元素

HTML中經常要 為 某些元素 指定顯示風格,比如 前景文字顏色是紅色, 背景顏色是黑色, 字體是微軟雅黑等。

那麽CSS必須告訴瀏覽器:要 選擇哪些元素 , 來使用這樣的顯示風格。

CSS Selector 語法就是用來選擇元素的。

既然它能選擇元素,正好我們web 自動化也要選擇元素, 所以selenium規範就把 CSS Selector 也納入到選擇元素的方法中了。

只要 CSS Selector 的語法是正確的, Selenium 就可以選擇到該元素。

通過 CSS Selector 選擇單個元素的方法是

find_element_by_css_selector(CSS Selector參數)

選擇所有元素的方法是

find_elements_by_css_selector(CSS Selector參數)

CSS Selector 選擇元素非常靈活強大, 大家可以從下面的例子看出來。

根據 tag名、id、class 選擇元素

CSS Selector 同樣可以根據tag名、id 和 class 選擇元素,

根據 tag名 選擇元素的 CSS Selector 語法非常簡單,直接就是tag名,

比如 要選擇 所有的tag名為div的元素,就可以是這樣

elements = driver.find_elements_by_css_selector(‘div‘)

等價於

elements = driver.find_elements_by_tag_name(‘div‘)

根據id 選擇元素的語法是在id號前面加上一個井號: #<id值>

比如 這個網址

有下面這樣的元素:

<input type="text" id=‘searchtext‘ />

就可以使用 #searchtext 這樣的 CSS Selector 來選擇它。

比如,我們想在 id 為 searchtext 的輸入框中輸入文本 你好 ,完整的Python代碼如下

from selenium import webdriver

driver = webdriver.Chrome(r‘d:\webdrivers\chromedriver.exe‘)

driver.get(‘http://www.python3.vip/doc/tutorial/python/code/sample1.html‘)

element = driver.find_element_by_css_selector(‘#searchtext‘)
element.send_keys(‘你好‘)

根據class 選擇元素的語法是在 class 值 前面加上一個點: .<class值>

比如 這個網址

要選擇所有的class 屬性值為 animal的元素 動物 除了這樣寫

elements = driver.find_elements_by_class_name(‘animal‘)

還可以這樣寫

elements = driver.find_elements_by_css_selector(‘.animal‘)

因為是選擇 所有的 ,所以用 find_elements 而不是 find_element

選擇 子元素 和 後代元素

HTML中, 元素 內部可以包含其他元素, 比如 下面的一個HTML片段

<div id=‘container‘>
    
    <div id=‘layer1‘>
        <div id=‘inner11‘>
            <span>內層11</span>
        </div>
        <div id=‘inner12‘>
            <span>內層12</span>
        </div>
    </div>

    <div id=‘layer2‘>
        <div id=‘inner21‘>
            <span>內層21</span>
        </div>
    </div>
    
</div> 

Web自動化 - 選擇操作元素 2

本文目錄

  • CSS SELECTOR 語法選擇元素
    • 根據 TAG名、ID、CLASS 選擇元素
    • 選擇 子元素 和 後代元素
    • 混合運用
    • 驗證 CSS SELECTOR

前面我們看到了根據 id、class屬性、tag名 選擇元素。

如果我們要選擇的 元素 沒有id、class 屬性, 這時候我們通常可以通過 CSS selector 語法選擇元素。

CSS Selector 語法選擇元素

HTML中經常要 為 某些元素 指定顯示風格,比如 前景文字顏色是紅色, 背景顏色是黑色, 字體是微軟雅黑等。

那麽CSS必須告訴瀏覽器:要 選擇哪些元素 , 來使用這樣的顯示風格。

CSS Selector 語法就是用來選擇元素的。

既然它能選擇元素,正好我們web 自動化也要選擇元素, 所以selenium規範就把 CSS Selector 也納入到選擇元素的方法中了。

只要 CSS Selector 的語法是正確的, Selenium 就可以選擇到該元素。

通過 CSS Selector 選擇單個元素的方法是

find_element_by_css_selector(CSS Selector參數)

選擇所有元素的方法是

find_elements_by_css_selector(CSS Selector參數)

CSS Selector 選擇元素非常靈活強大, 大家可以從下面的例子看出來。

根據 tag名、id、class 選擇元素

CSS Selector 同樣可以根據tag名、id 和 class 選擇元素,

根據 tag名 選擇元素的 CSS Selector 語法非常簡單,直接就是tag名,

比如 要選擇 所有的tag名為div的元素,就可以是這樣

elements = driver.find_elements_by_css_selector(‘div‘)

等價於

elements = driver.find_elements_by_tag_name(‘div‘)

根據id 選擇元素的語法是在id號前面加上一個井號: #<id值>

比如 這個網址

有下面這樣的元素:

<input type="text" id=‘searchtext‘ />

就可以使用 #searchtext 這樣的 CSS Selector 來選擇它。

比如,我們想在 id 為 searchtext 的輸入框中輸入文本 你好 ,完整的Python代碼如下

from selenium import webdriver driver = webdriver.Chrome(r‘d:\webdrivers\chromedriver.exe‘) driver.get(‘‘) element = driver.find_element_by_css_selector(‘#searchtext‘) element.send_keys(‘你好‘)

根據class 選擇元素的語法是在 class 值 前面加上一個點: .<class值>

比如 這個網址

要選擇所有的class 屬性值為 animal的元素 動物 除了這樣寫

elements = driver.find_elements_by_class_name(‘animal‘)

還可以這樣寫

elements = driver.find_elements_by_css_selector(‘.animal‘)

因為是選擇 所有的 ,所以用 find_elements 而不是 find_element

選擇 子元素 和 後代元素

HTML中, 元素 內部可以包含其他元素, 比如 下面的一個HTML片段

<div id=‘container‘> <div id=‘layer1‘> <div id=‘inner11‘> <span>內層11</span> </div> <div id=‘inner12‘> <span>內層12</span> </div> </div> <div id=‘layer2‘> <div id=‘inner21‘> <span>內層21</span> </div> </div> </div>

id 為 container 的div元素 包含了 id 為 layer1layer2 的兩個div元素。 這種包含是直接包含, 中間沒有其他的包含層次了。 所以 id 為 layer1layer2 的兩個div元素 是 id 為 container 的div元素 的 直接子元素

而 id 為 layer1 的div元素 又包含了 id 為 inner11inner12 的兩個div元素。 這種包含關系也是直接子元素 關系

id 為 layer2 的div元素 又包含了 id 為 inner21 這個div元素。 這種包含關系也是直接子元素 關系

而對於 id 為 container 的div元素來說, id 為 inner11inner12inner22 的元素 和 上面的兩個span 元素 都不是 它的直接子元素, 因為中間隔了 幾層。

雖然不是直接子元素, 但是 它們還是在 container 的內部, 可以稱之為它 的 後代元素

後代元素也包括了直接子元素, 比如 id 為 layer1layer2 的兩個div元素 是 id 為 container 的div元素 的 直接子元素,同時也是後代子元素

如果 元素1元素2 的 直接子元素, CSS Selector 選擇子元素的語法是這樣的

元素1 > 元素2

中間用一個大於號 (我們可以理解為箭頭號)

最終選擇的元素是 元素2

也支持更多層級的選擇, 比如

元素1 > 元素2 > 元素3 > 元素4

就是選擇 元素1 裏面的子元素 元素2 裏面的子元素 元素3 裏面的子元素 元素4 , 最終選擇的元素是 元素4

如果 元素1元素2 的 後代元素, CSS Selector 選擇後代元素的語法是這樣的

元素1   元素2

中間是一個或者多個空格隔開

最終選擇的元素是 元素2

也支持更多層級的選擇, 比如

元素1   元素2   元素3  元素4

最終選擇的元素是 元素4

混合運用

CSS selector的強大之處 就是上面的方法可以混合使用

比如, 我們要選擇 下面的 html 中的元素 <span class=‘copyright‘>版權</span>

<div id=‘bottom‘>
    <div class=‘footer1‘>
        <span class=‘copyright‘>版權</span>
        <span class=‘date‘>發布日期:2018-03-03</span>
    </div>
    <div class=‘footer2‘>
        <span>備案號
            <a href="http://www.miitbeian.gov.cn">蘇ICP備88885574號</a>
        </span>
    </div>        
</div>

CSS selector 表達式就是

div.footer > span.copyright

也可以更簡單:

.footer > .copyright

當然 這樣也是可以的:

.footer  .copyright

因為子元素同時也是後代元素

驗證 CSS Selector

那麽我們怎麽驗證 CSS Selector 的語法是否正確選擇了我們要選擇的元素呢?

當然可以像下面這樣,寫出Python代碼,運行看看,能否操作成功

element = driver.find_element_by_css_selector(‘#searchtext‘) 
element.input(‘輸入的文本‘)

如果成功,說明選擇元素的語法是正確的。

但是這樣做的問題就是:太麻煩了。

當我們進行自動化開發的時候,有大量選擇元素的語句,都要這樣一個個的驗證,就非常耗時間。

由於 CSS Selector 是瀏覽器直接支持的,可以在瀏覽器開發者工具欄中驗證。

比如我們使用Chrome瀏覽器打開

按F12 打開 開發者工具欄

如果我們要驗證 下面的表達式

#bottom > .footer2  a

能否選中 這個元素

<a href="http://www.miitbeian.gov.cn">蘇ICP備88885574號</a>

可以這樣做:

點擊 Elements 標簽後, 同時按 Ctrl 鍵 和 F 鍵, 就會出現下圖箭頭處的 搜索框

技術分享圖片

我們可以在裏面輸入任何 CSS Selector 表達式 ,如果能選擇到元素, 右邊的的紅色方框裏面就會顯示出類似 2 of 3 這樣的內容。

of 後面的數字表示這樣的表達式 總共選擇到幾個元素

of 前面的數字表示當前黃色高亮顯示的是 其中第幾個元素

上圖中的 1 of 1 就是指 : CSS selector

#bottom > .footer2  a

在當前網頁上共選擇到 1 個元素, 目前高亮顯示的是第1個。

如果我們輸入 .plant 就會發現,可以選擇到3個元素

技術分享圖片技術分享圖片

訪問 白月黑羽教Python 查看更多教程

Web自動化 - 選擇操作元素 2