知否知否—–selenium知多少

  • 2019 年 10 月 6 日
  • 筆記

關於selenium,就不多介紹什麼了,主要就是用來進行自動化的工具。怎樣進行自動化,這才是它大放異彩的地方。下面就來看看吧!

selenium定位

關於定位,一共有八種方法:

  • find_element_by_id()
  • find_element_by_name()
  • find_element_by_class_name()
  • find_element_by_tag_name()
  • find_element_by_link_text()
  • find_element_by_partial_link_text()
  • find_element_by_xpath()
  • find_element_by_css_selector()

用的比較多的是id,xpath

xpath的話不一定需要xpath基礎,主要是chrome瀏覽器可以在控制卡右鍵獲取,是不是很方便??

還有一些其他的:

下面是我們要定位的元素(從百度[www.baidu.com]拿過來的):

<input id="kw" class="s_ipt" name="wd"

value="" maxlength="255" autocomplete="off"

  • 通過id定位:
dr.find_element_by_id("kw")
  • 通過name定位:
dr.find_element_by_name("wd")
  • 通過class name定位:
dr.find_element_by_class_name("s_ipt")
  • 通過tag name定位:
dr.find_element_by_tag_name("input")
  • 通過css定位:
dr.find_element_by_css_selector("#kw")

Selenium控制瀏覽器

首先,最基礎的,打開百度:

from selenium import webdriver  driver = webdriver.Chrome()  driver.get("http://www.baidu.com")

這個應該沒多大問題。

關於瀏覽器的一些設置這才是重點:

現在我需要:

設置瀏覽器寬400、高900顯示

driver.set_window_size(400, 900)

控制瀏覽器前進、後退:

我們打開了第二個網頁新聞

driver.get('http://news.baidu.com')

後退到一開始的百度:

driver.back()

再前進到新聞

driver.forward()

Selenium-Webdriver常用方法

用戶對於網頁的常用操作無非以下幾種:

點擊

driver.find_element_by_id("kw").click()

在找到元素後觸發點擊事件

輸入:

driver.find_element_by_id("kw").send_keys("python大法好")

找到輸入框後,觸發輸入方法

(這裡有一點要說一下,為了證明你是一個合格的或者是比較細心的tester,這時候你就需要在輸入之前做一件事,這件事就是清空數據,防止輸入框裡面有快取數據,我們就需要清空

driver.find_element_by_id("kw").clear()

還有就是表單提交

driver.find_element_by_id("kw").send_keys("python大法好").submit()

submit方法

還有一些不常用的方法:

獲取元素的大小尺寸:

driver.find_element_by_id("kw").size

獲取元素的文本:

driver.find_element_by_id("kw").text 

獲取屬性值:

driver.find_element_by_id("kw").get_attribute('type')

查看元素是否可見:

driver.find_element_by_id("kw").is_displayed()

Selenium滑鼠

關於滑鼠,我們之前有個click事件其實就說滑鼠的功能,現在我們看看還有哪些常用操作。

在selenium里,這些操作都封裝在ActionChains 類中。

可以通過下面這種方法直接導入ActionChains這個類:

from selenium.webdriver import ActionChains
  • perform(): 執行所有 ActionChains 中存儲的行為;
  • context_click(): 右擊;
driver.find_element_by_id("kw").context_click()
  • double_click(): 雙擊;
driver.find_element_by_id("kw").double_click()
  • drag_and_drop(): 拖動;
  • move_to_element(): 滑鼠懸停。

滑鼠懸停的時候分為兩步,先定位到懸停的元素,再對定位到的元素執行滑鼠懸停操作。

above = driver.find_element_by_link_text("設置")  ActionChains(driver).move_to_element(above).perform()

Selenium鍵盤事件

Keys()類提供了鍵盤上幾乎所有按鍵的方法。

我們之前說過send_keys()方法可以用來模擬鍵盤輸入。

刪除一個字元

如果說之前輸入了1233

driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)

執行了這一句之後輸入就變成123

輸入空格

driver.find_element_by_id("kw").send_keys(Keys.SPACE)

全選輸入框的內容 Ctrl + a

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

剪貼 Ctrl + x

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

粘貼 Ctrl + v

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')

複製 Ctrl + c

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'c')

回車鍵

driver.find_element_by_id("su").send_keys(Keys.ENTER)

Selenium斷言

做測試最重要的就是斷言,我們通常可以通過獲取title 、URL和text等資訊進行斷言。

在python裡面有個assert的關鍵字,這是我們做斷言的關鍵,在selenium裡面我們可以將測試的結果和預期的結果做比較,這樣就是一種斷言。

driver.title  driver.find_element_by_class_name('nums').text

Selenium等待

等待分為兩種,一種是顯式等待,一種是隱式等待。

顯式等待是WebdDriver等待某個條件成立時繼續執行,否則在達到最大時長時拋出超時異常。

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)  driver :瀏覽器驅動。  timeout :最長超時時間,默認以秒為單位。  poll_frequency :檢測的間隔(步長)時間,默認為0.5S。  ignored_exceptions :超時後的異常資訊,默認情況下拋NoSuchElementException異常。  WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的說明。  until(method, message=『』)  調用該方法提供的驅動程式作為一個參數,直到返回值為True。  until_not(method, message=『』)  調用該方法提供的驅動程式作為一個參數,直到返回值為False。
driver = webdriver.Chrome()  driver.get("http://www.baidu.com")    element = WebDriverWait(driver, 5, 0.5).until(                        EC.presence_of_element_located((By.ID, "kw")))  element.send_keys('python亂燉')

隱式等待

WebDriver提供了implicitly_wait()方法來實現隱式等待,默認設置為0。它的用法相對來說要簡單得多。

driver.implicitly_wait(1)

這就是一個簡單的隱式等待。

默認參數的單位為秒,本例中設置等待時長為1秒。首先這1秒並非一個固定的等待時間,它並不影響腳本的執行速度。其次,它並不針對頁面上的某一元素進行等待。當腳本執行到某個元素定位時,如果元素可以定位,則繼續執行;如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。若直到超出設置時長(1秒)還沒有定位到元素,則拋出異常。

下期繼續。