1. 程式人生 > >(轉)implicitly_wait()隱式等待和explicit_wait()顯示等待

(轉)implicitly_wait()隱式等待和explicit_wait()顯示等待

現在越來越多的 web app 使用 AJAX 技術。當一個頁面載入到瀏覽器後,這個頁面的很多元素載入的時間可能不一致。這就使得元素定位比較尷尬了,如果某個要定位的元素還沒有加載出來,在定位的時候,就會丟擲異常: ElementNotVisibleException。這個時候,合理使用 wait ,我們就能很好的緩解這個尷尬。Selenium Webdriver 提供了兩種型別的等待方法:隱式等待(implicit) 和 顯示等待(explicit)。 顯示等待情況下,只有特定條件觸發後,WebDriver 才會繼續執行後續操作。隱式等待情況下,WebDriver 等待一定時間,該時間段內,如果特定元素沒載入成功,則丟擲異常。

1. Explicit Waits(顯示等待)

顯示等待的程式碼定義了等待條件,只有該條件觸發,才執行後續程式碼。最垃圾的顯示等待就是使用 time.sleep(),這種情況是指定了固定的等待時長。 存在一些特別方便的方法,可以使你的程式碼只等待需要的時常,而不是固定的時常。WebDriverWait 和 ExpectedCondition 組合使用,就是一種有效的解決手段。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()driver.get("http://somedomain/url_that_delays_loading")
try:    
    element = WebDriverWait(driver, 10).until(           
        EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:    
    driver.quit()

上面的程式碼最多等待 10 秒,超時後就丟擲 TimeoutException,假設在第3秒就找到了這個元素,那麼也就不會多等剩下的7秒使時間,而是繼續執行後續程式碼。WebDriverWait 預設每 500 毫秒呼叫一次 ExpectedCondition 中的方法,直到它返回成功訊號,如果成功,則返回相應的內容,否則返回布林型別的 False。

from selenium.webdriver.support import expected_conditions as EC

wait_result = WebDriverWait(driver=self.driver, timeout=300, poll_frequency=0.5,  ignored_exceptions=None).until(
    EC.text_to_be_present_in_element((By.XPATH, '//*[@id="VolumeTable"]/tbody/tr[1]/td[4]/label'), u'可用'))

driver:瀏覽器驅動
timeout:最長超時等待時間
poll_frequency:檢測的時間間隔,預設為500ms
ignore_exception:超時後丟擲的異常資訊,預設情況下拋 NoSuchElementException 異常

配合使用的 until() 或者 until_not() 方法說明:

  • until(method, message='')
    呼叫該方法體提供的回撥函式作為一個引數,直到返回值為True
  • until_not(method, message='')
    呼叫該方法體提供的回撥函式作為一個引數,直到返回值為False

模組包含一套預定義的條件集合。大大方便了 WebDriverWait 的使用。

Expected Conditions 類提供的預期條件判斷方法

在進行瀏覽器自動化的時候,有一些條件是經常出現的,下面列出的是每個條件的實現。Selenium Python binding provides some convienence 提供了很多實用的方法,因此,你無須再去編寫 expected_condition class 或是建立你自己的工具包來實現這個工作。

  • title_is:判斷當前頁面的title是否等於預期
  • title_contains:判斷當前頁面的title是否包含預期字串
  • presence_of_element_located:判斷某個元素是否被加到了dom樹裡,並不代表該元素一定可見
  • visibility_of_element_located:判斷某個元素是否可見. 可見代表元素非隱藏,並且元素的寬和高都不等於0
  • visibility_of:跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個方法直接傳定位到的element就好了
  • presence_of_all_elements_located:判斷是否至少有1個元素存在於dom樹中。舉個例子,如果頁面上有n個元素的class都是'column-md-3',那麼只要有1個元素存在,這個方法就返回True
  • text_to_be_present_in_element:判斷某個元素中的text是否 包含 了預期的字串
  • text_to_be_present_in_element_value:判斷某個元素中的value屬性是否包含了預期的字串
  • frame_to_be_available_and_switch_to_it:判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False
  • invisibility_of_element_located:判斷某個元素中是否不存在於dom樹或不可見
  • element_to_be_clickable - it is Displayed and Enabled:判斷某個元素中是否可見並且是enable的,這樣的話才叫clickable
  • staleness_of:等某個元素從dom樹中移除,注意,這個方法也是返回True或False
  • element_to_be_selected:判斷某個元素是否被選中了,一般用在下拉列表
  • element_located_to_be_selected
  • element_selection_state_to_be:判斷某個元素的選中狀態是否符合預期
  • element_located_selection_state_to_be:跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個方法傳入locator
  • alert_is_present:判斷頁面上是否存在alert

2. Implicit Waits(隱式等待)

隱式等待是在嘗試發現某個元素的時候,如果沒能立刻發現,就等待固定長度的時間。預設設定是0秒。一旦設定了隱式等待時間,它的作用範圍就是Webdriver物件例項的整個生命週期。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

相關推薦

()implicitly_wait()等待explicit_wait()顯示等待

現在越來越多的 web app 使用 AJAX 技術。當一個頁面載入到瀏覽器後,這個頁面的很多元素載入的時間可能不一致。這就使得元素定位比較尷尬了,如果某個要定位的元素還沒有加載出來,在定位的時候,就會丟擲異常: ElementNotVisibleException。這個時候,合理使用 wait ,我們就能很

基礎概念:鎖 Synchronized 與顯示鎖 Lock的用法簡單對比

轉自:https://blog.csdn.net/u011519624/article/details/61628611 Synchronized Synchronized是Java的關鍵字,當它用來修飾一個方法或一個程式碼塊時,能夠保證在同一時刻最多隻有一個執行緒執行該程式碼。因為當呼

Activity的呼叫顯示呼叫

在實際開發中,我們知道Activity之間及Android應用程式之間的通訊都少不了Intent的使用,而Intent主要負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,然後Android據此Intent的描述來找到對應的元件,將Intent傳遞給呼

java 呼叫顯示呼叫

當我們在呼叫類的構造器來建立物件的時候,首先要呼叫的是父類的非靜態的初始化塊,接著會呼叫構造器,但是父類的構造器可能有多個,也就是過載,當呼叫完父類的非靜態初始化塊之後,將會呼叫的是當前類的非靜態初始

android Intent (意圖顯示意圖)

2. 顯式意圖、隱式意圖     Intent可以劃分成顯式意圖和隱式意圖。     顯式意圖:呼叫Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明確指定了元件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該

轉換轉換

string 運算 依次 col 指向 pri ast 現象 style C/C++對於數據類型的轉換包括隱式轉換和顯式轉換(強制類型轉換)。 一般來說,隱式轉換包括以下幾種情形: 1. 低精度與高精度混合運算,低精度會隱式轉換成高精度類型。 int a = 10; do

Scala 中的轉換參數

定義 定義函數 scala 行為 hub 隱式 實現 發現 com 隱式定義是指編譯器為了修正類型錯誤而允許插入到程序中的定義。 舉例: 正常情況下 顯然會報錯,因為 String 類並沒有實現 / 這個方法,我們無法去決定 String 類的行為,這個時候就可以用上 im

Scala基礎:閉包、柯里化、轉換引數

閉包,和js中的閉包一樣,返回值依賴於宣告在函式外部的一個或多個變數,那麼這個函式就是閉包函式。 val i: Int = 20 //函式func的方法體中使用了在func外部定義的變數 那func就是個閉包函式 val func = (x: Int) => x +

java引數引數

      隱式引數:是呼叫函式的物件,在類的方法中呼叫了類的例項域,這個被呼叫的例項域就是隱式引數。或者說是當前方法的物件, 一般我們會使用this關鍵字來使用隱式引數,this表示呼叫該方法的當前類的當前例項,使用this關鍵字可以很好的把顯式引數和隱式引

Scala中的轉換函式、引數

所謂隱式轉換函式指的是implicit關鍵字修飾的且只有一個引數的函式。 例如: inplicit def int2String(n:Int):String = (n.toString) 上案例:我們把Fruit物件轉換成了Monkey物件 //

動態連結庫建立呼叫

1.建立 我選的WIN32控制檯,下一步,勾DLL選項。 在專案新建一個類,在類前面加__declspec(dllimport) #define MYDLL  __declspec(dllexport)#else#define MYDLL  __declspec(dl

scala13——S轉換引數

Scala提供的隱式轉換和隱式引數功能,是非常有特色的功能。是Java等程式語言所沒有的功能。它可以允許你手動指定,將某種型別的物件轉換成其他型別的物件或者是給一個類增加方法。通過這些功能,可以實現非常強大、特殊的功能。 1、隱式轉換 Scala的隱式轉換,其

Javascript 轉換 toString + valueOf

Aphorism Grow in errors 一、 js 資料型別 原始值型別 primitive type(基本/簡單): String, Number, Boolean, undefined, null 引用型別: Array, Function, Object

Scala入門第十篇--轉換引數

這次我們介紹隱式轉換和隱式引數,會做簡單的程式碼示例 對於概念看不懂的童鞋,可以先去看看程式碼的示例 隱式轉換 概念引入 在講述之前我們先引入一個例子 scala> 1 to 10 res9: scala.collection.immutable.Ran

Scala 轉換引數

1.隱式轉換     隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別。 implicit def a(d: Double) = d.toInt //不加上邊這句你試試 val i1:

【圖文詳細 】Scala——轉換引數

2、Scala 隱式轉換和隱式引數  隱式轉換和隱式引數是 Scala 中兩個非常強大的功能,利用隱式轉換和隱式引數,你可以提 供優雅的類庫, 對類庫的使用者隱匿掉那些枯燥乏味的細節。    隱式的對類的方法進行增強,豐富現有類庫的功能  &nbs

快學Scala學習筆記及習題解答(21-22轉換引數、定界延續)

本文Scala使用的版本是2.11.8 第21章 隱式轉換和隱式引數 21.1 基本概念 所謂隱式轉換函式(implicit conversion function)指的是那種以implicit關鍵字宣告的帶有單個引數的函式。這樣的函式將被自動應用

【DDL】DDL的commit自治事務

DDL的隱式commit和自治事務 DDL的隱式commit ddl的執行過程 Begin   Commit;   Ddl;   Commit; Exception   When others then        Rollback;        Raise; En

PostgreSQL中的連線連線

連線有多種形式,例如內連線,外連線,交叉連線,自連線等。但是最重要的區別之一是隱式連線和顯式連線之間的區別。 隱式連線 FROM子句後面直接列出多個表名,這種連線方式即屬於內連線,是隱式連線。 示例: postgres=# CREATE TABLE test_1(id int, cl

父類構造器的呼叫呼叫

當呼叫某個類的構造器來建立Java物件時,系統總會先呼叫父類的非靜態初始化塊進行初始化.這個呼叫是隱式執行的,而且父類的靜態初始化塊總是會被執行.接著會呼叫父類的一個或多個構造器執行初始化,這個呼叫既可以是通過super進行顯式呼叫,也可以是隱式呼叫. 當所有父類的非靜態初