What's the purpose and upside of using By from selenium.webdriver.common.by instead of instead of the normal find_element_by_... methods? For example:
driver.find_element_by_id('some_ID')
vs:
from selenium.webdriver.common.by import By
driver.find_element(By.ID, 'some_ID')
According to documentation find_element()
seem to be kind of "private" method that is used by find_element_by_...()
methods and also might be used in Page Object
So using Page Object pattern is the reason why you might need find_element()
+ By
instead of find_element_by_...()
.
For example, you have some variable that contains elements' id
value
link_id = "some_id"
and you use it to locate element as
my_link = driver.find_element_by_id(link_id)
If for some reason id
attribute was removed from element, you need both to update selector and replace find_element_by_...()
method in my_link
as
link_class_name = "some_class_name"
my_link = driver.find_element_by_class_name(link_class_name)
If you use By
, then your initial locator might be
link_locator = (By.ID, "some_id")
and you locate your element as
my_link = find_element(*link_locator)
In case of changes in HTML
source you need just to update your link_locator
as
link_locator = (By.CLASS_NAME, "some_class_name")
and my_link
remains exactly the same
Both of these methods are from the RemoteWebDriver class.
findElement(By.id()) requires you to created your own By.id instance.
findElementById(String) is a helper function that will generate the By.id
instance for you.
It comes down to providing you with the flexibility to choose what you want to keep track of in your tests/framework. Do you want to track locators as Strings? Do you want to track locators as By objects?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With