Uso de Angular JS (transportador) con selenium en Python

Estoy tratando de seleccionar un área de texto envuelta en angular 1 usando selenium , pero no se puede ver en DOM. Hay un módulo llamado Pytractor . He estado tratando de resolver esto pero no puedo usarlo correctamente.

Puede alguien ayudarme con esto?

También puede usar los enlaces de selenium regulares para probar las aplicaciones AngularJS. Necesitaría utilizar Esperas explícitas para esperar a que aparezcan, desaparezcan los elementos, el título / url para cambiar, etc., para cualquier acción que le permita continuar con la prueba de la página.

Ejemplo (esperando que aparezca el elemento textarea ):

 from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) wait.until(EC.visibility_of_element_located((By.TAG_NAME, "myaccount"))) 

Hay una cosa importante que pytractor (como el protractor mismo) proporciona: sabe cuándo AngularJS está resuelto y listo, los modelos se actualizan, no hay solicitudes asíncronas pendientes, etc. No significa que tenga que usarlo para probar las aplicaciones de AngularJS . Pero te da una ventaja.

Además, pytractor proporciona nuevos localizadores, por ejemplo, puede encontrar un elemento por modelo o enlace. Tampoco significa que no pueda encontrar el mismo elemento utilizando otras técnicas de ubicación que el python común de selenium proporciona de manera inmediata .

Tenga en cuenta que pytractor no está desarrollado y mantenido activamente en este momento.

Puede simplemente extraer el transportador para obtener fragmentos de código útiles. Personalmente uso esta función que bloquea hasta que Angular termina de renderizar la página.

 def wait_for_angular(self, selenium_driver): selenium_driver.set_script_timeout(10) selenium_driver.execute_async_script(""" callback = arguments[arguments.length - 1]; angular.element('html').injector().get('$browser').notifyWhenNoOutstandingRequests(callback);""") 

Reemplaza 'html' por cualquier elemento que sea tu 'ng-app' .

La solución para Angular 1 proviene del transportador /lib/clientsidescripts.js#L51 . También podría ser posible adaptar la solución a Angular 2 usando este código actualizado