¿Por qué usar find_element (By …) en lugar de find_element_by_

¿Cuál es el propósito y la ventaja de usar By de selenium.webdriver.common.by en lugar de los métodos normales de find_element_by _…? Por ejemplo:

driver.find_element_by_id('some_ID') 

vs:

 from selenium.webdriver.common.by import By driver.find_element(By.ID, 'some_ID') 

Según la documentación, find_element() parece ser un tipo de método ” privado ” que es utilizado por los find_element_by_...() y también se puede usar en Page Object

Por lo tanto, usar el patrón de Objeto de página es la razón por la que podría necesitar find_element() + By lugar de find_element_by_...() .

Por ejemplo, tienes alguna variable que contiene el valor de id los elementos

 link_id = "some_id" 

y lo usas para ubicar el elemento como

 my_link = driver.find_element_by_id(link_id) 

Si, por alguna razón, el atributo id se eliminó del elemento, necesita actualizar el selector y reemplazar el find_element_by_...() en my_link como

 link_class_name = "some_class_name" my_link = driver.find_element_by_class_name(link_class_name) 

Si usa By , entonces su localizador inicial podría ser

 link_locator = (By.ID, "some_id") 

y ubicas tu elemento como

 my_link = find_element(*link_locator) 

En caso de cambios en la fuente HTML , solo necesita actualizar su link_locator como

 link_locator = (By.CLASS_NAME, "some_class_name") 

y my_link sigue siendo exactamente el mismo

Ambos métodos son de la clase RemoteWebDriver.

 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. 

Se trata de proporcionarle la flexibilidad para elegir lo que desea realizar un seguimiento de sus pruebas / marco. ¿Quieres rastrear localizadores como cadenas? ¿Quieres rastrear localizadores como por objetos?