(轉)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進行顯式呼叫,也可以是隱式呼叫. 當所有父類的非靜態初