In automated testing with Selenium, the use of dynamic locators is crucial, especially when dealing with web pages where element attributes frequently change. Dynamic locators help us locate these frequently changing elements more flexibly and stably.
What are Dynamic Locators?
Dynamic locators do not refer to a specific locator type but rather to dynamically constructed locator expressions based on specific element attributes. These expressions typically avoid relying on easily changing attributes, such as element IDs or names, which may vary with page updates.
How to Use Dynamic Locators?
Typically, dynamic locators are implemented by leveraging stable attributes of elements or relative paths for locating elements. Here are several common methods:
1. CSS Selectors
CSS selectors are a powerful tool for locating elements based on class names, attributes, etc. For example, if a login button's ID changes with each login, we can use its class name (if it is stable):
pythondriver.find_element_by_css_selector('.login-button')
If the class name is also unstable, it may be necessary to locate based on other attributes or combined attributes:
pythondriver.find_element_by_css_selector('button[type="submit"]')
2. XPath
XPath is a highly flexible locator method, allowing location based on element hierarchy or attributes. With XPath, we can locate parent or sibling elements and then find the target element. For example:
pythondriver.find_element_by_xpath('//div[@class="form"']/button[1]')
Here, //div[@class="form"']/button[1] locates the first button under the div with class form.
3. Locating by Relationships
Sometimes, you can locate the target element based on relationships between elements. For example, to locate a link under a specific paragraph, first locate the paragraph and then the link:
pythonparagraph = driver.find_element_by_xpath('//p[text()="specific text"]') link = paragraph.find_element_by_tag_name('a')
Example
Suppose we need to test a dynamically generated user list where user IDs change with each page refresh. We can use the contains function in XPath to locate:
python# Assuming user names are relatively stable driver.find_element_by_xpath('//td[contains(text(), "username")]/following-sibling::td')
Here, the XPath queries the td element containing the text "username" and then locates its following sibling td element, which could represent the user ID or other relevant information.
In summary, the key to using dynamic locators is to identify sufficiently stable attributes or locate elements through hierarchical relationships. This approach enhances the stability and flexibility of testing.