(i) preface
A sudden resource constraint or network delay may result in the target element not being found, and the test report shows that the test failed. In this case, a delay mechanism is required to match the speed of the script with the response speed of the program, and Webdriver provides both implicit and explicit wait mechanisms.
(ii) Implicit wait
Once the implicit wait time is set, it acts on the entire life cycle of the Webdriver instance (which takes effect for all element lookups), and after setting the implicit wait time, Webdriver continuously detects and searches the DOM for a certain amount of time, To make it easier to find one or more elements that are not immediately loaded successfully and available. The default time for an implicit wait is 0. Webdriver uses implicitly_wait () to set the wait time, in seconds. More than waiting time has not been found, reported nosuchelementexception abnormal.
# set the time-out to 10 seconds
Driver.implicitly_wait (10)
(iii) Explicit Wait
Webdriver provides webdriverwait classes and Expected_conditions modules to implement explicit waits. The display waits more intelligently than the implicit wait. Display wait is set a precondition, in the waiting time, every time after checking whether the precondition is satisfied, the next step is fulfilled, the timeout is reported timeoutexception exception.
(iv) webdriverwait class
Webdriverwait (Driver, timeout, poll_frequency=poll_frequency, ignored_exceptions=None)
Driver: Browser Driver instance
Timeout: Wait time, per second
Poll_frequency: Check once every few times, default 0.5 seconds
Ignored_exceptions: Ignored exception, default only Nosuchelementexception
Until methods and Until_not methods:
Until (method, message="): means the method to be executed (to be executed once every time during the wait time) until the return value is true and the timeout is reported timeoutexception exception, Message will pass in exception (message parameter is optional)
Until_not (method, message="): Until the return value is false, the other and until are the same
(v) expected_conditions Module
The Expected_conditions module provides a variety of well-defined preconditions that need to be used with webdriverwait.
Expected wait condition (pre-condition) |
Simple description |
Element_to_be_clickable (Locator) Parameter: Locator, refers to a group (by,locator) For example: Webdriverwait (driver,10). Until (Expected_conditions.element_to_be_clickable ((By.name,' one '))) The following are all in this way, only the preconditions are different, the parameters may be different Webdriverwait (driver,10). Until () |
The element waiting to be found is visible and available so that it can be clicked to return the anchored element
|
element_to_be_selected (Locator) |
Wait until the element is selected |
invisibility_of_element_located (Locator)
|
Wait for an element to be invisible or nonexistent in the DOM |
presence_of_all_elements_located (Locator)
|
Waits for at least one locator lookup element to appear in the Web page, returning a set of elements |
presence_of_element_located (Locator)
|
The element that waits for the locator to find appears in the Web page, or can be found in the DOM, returning an element that is anchored to |
Text_to_be_present_in_element (Locator,text) Parameters: text, specified literal |
Wait for the element to be positioned with the specified text information |
Title_contains (title) Parameter: Title, which is the string to verify the title contains |
Waits for the page header to contain the specified string, returns True if successful, or false |
Title_is (title) Parameter: Title, the caption to check |
Wait for page title to match expected, return true on success, or false |
Visibility_of (Element) Parameter: element, which refers to a component |
The wait element appears in the DOM, is visible, and the width and height are greater than 0 and become visible, returning an element (the same one) |
visibility_of_element_located (Locator) |
The wait element appears in the DOM, is visible, and the width and height are greater than 0 and become visible, returning an element |
Alert_is_present () |
Determine if a warning window exists |
(vi) expected_conditions Example
The following code, try: section, each part is independently available (I just verify that the usage of the different preconditions is commented out). In addition, there is only a description of how the method is used (the function of the method) and does not explain the use of the scene (such as whether it is necessary or not).
1 fromSeleniumImportWebdriver2 fromSelenium.webdriver.support.uiImportwebdriverwait3 fromSelenium.webdriver.supportImportexpected_conditions4 fromSelenium.webdriver.common.byImport by5 6Driver =Webdriver. Firefox ()7 Driver.maximize_window ()8Driver.get ('https://www.cnblogs.com/')9 Ten #Try: One ##等待博客园首页的 the "Look for" button is visible and available A #search_btn = webdriverwait (driver,10). Until (Expected_conditions.element_to_be_clickable (By.CLASS_NAME, ' Search_btn ' ))) - #Print (Search_btn.get_attribute (' value ')) - the #Try: - #Login_area = driver.find_element_by_css_selector (' #login_area ') - #login = login_area.find_element_by_link_text (' login ') - #Login.click () + #Remember_me = driver.find_element_by_id (' Remember_me ') - #Remember_me.click () + ##等待直到登录页面的复选框被选中 A #webdriverwait (Driver). Until (expected_conditions.element_located_to_be_selected (by.id, ' Remember_me ')) at - #Try: - #search_file = driver.find_element_by_id (' zzk_q ') - #search_btn = driver.find_element_by_class_name (' search_btn ') - #search_file.send_keys (' python ') - #Search_btn.click () in ##网页标题是否包含 python - #webdriverwait (Driver). Until (expected_conditions.title_contains (' Python ')) to + Try: -Search_file = driver.find_element_by_id ('zzk_q') the #checks whether an element appears in the DOM, is visible, and is greater than 0 *Search_file = webdriverwait (driver,10). Until (expected_conditions.visibility_of (search_file) ) $ Print(Search_file)Panax Notoginseng finally: -Driver.quit ()
(vii) Example (custom preconditions)
The Expected_conditions class provides a variety of well-defined preconditions (expected wait conditions), and you can also customize preconditions by webdriverwait when there are no preconditions to match.
The following is a partial comment that comes with the Webdriverwait class.
class webdriverwait (object): def __init__ (Self, driver, timeout, poll_frequency=poll_frequency, ignored_exceptions=None): """ Example: from selenium.webdriver.support.ui import webdriverwait \ n element = webdriverwait ( Driver). Until (Lambda x:x.find_element_by_id ("Someid") \ n is_disappeared = webdriverwait (Driver, 30, 1, ( elementnotvisibleexception). \ \ n until_not (lambda x:x.find_element_by_id ("Someid"). is_displayed ()) """
Example: (Wait for the blog Park Personal homepage (click on the homepage of the garden to jump to the page) the drop-down menu has 5 options)
#lambda表达式其实就是一个匿名函数, the left side of the colon can be understood as the function name and parameters, the right can be understood as the return value of the function, the specific can be Baidu Python lambda
fromSeleniumImportWebdriver fromSelenium.webdriver.support.uiImportwebdriverwait fromSelenium.webdriver.support.uiImportSelectprofile=Webdriver. Firefoxprofile (R'C:\Users\quanhua\AppData\Roaming\Mozilla\Firefox\Profiles\tnwjkr4m.selenium') Driver=Webdriver. Firefox (Profile) Driver.maximize_window () Driver.get ('https://home.cnblogs.com/')Try: #wait for a drop-down menu in the blog Park Personal home page with 5 options availableWebdriverwait (driver,10). Until (LambdaL:len (Select (l.find_element_by_id ('sel_application'). Options) = = 5)finally: Driver.quit ()
(eight) Summary
Applying element-wait mechanisms is essential for building highly stable and reliable tests. In the process of use, should try to avoid the implicit wait and display waiting for mixed use. As for the implicit waiting and display of the advantages and disadvantages of waiting, reading on and on the Internet is generally more recommended to use the display wait, but I have tried it, for the time being do not see how much difference in the speed of operation (perhaps after a relatively rich project experience, then back to say that the implicit wait and show the pros and cons of waiting).
Python+selenium notes (10): element wait mechanism