angularjs - ngdisabled - Protractor+controlador de cromo: el elemento no se puede hacer clic en el punto
ngdisabled angular 2 (13)
Arreglo este problema usando el tiempo de espera del navegador.
browserSync.init(files, {
server: {
baseDir: "dist",
index: "index.html"
},
notify: false
});
antes de dar clic en el botón
Hola, estoy teniendo algunos problemas para que una prueba de transportador básica funcione.
Mi configuración:
- Utilizo requirejs, así que inicio angular usando angular.bootstrap (), no la aplicación ng-app attr. Según los documentos del transportador, esto no se admite de forma inmediata, pero parece funcionar bien para las pruebas que no implican hacer clic.
Transportador conf.json:
"use strict"; exports.config = { specs: ''../E2ETests/**/*.js'', chromeOnly: true, getPageTimeout: 30000, allScriptsTimeout: 30000 }
- Utilizo algunos tapones de jquery de terceros que envuelvo en directivas, sospecho que pueden ser parte del problema.
La prueba:
"use strict";
describe(''When clicking should add stuff'', function () {
var ptor;
beforeEach(function () {
browser.get(''https://localhost/myApp'');
ptor = protractor.getInstance();
});
it(''add stuff'', function () {
// If I comment this, the test pass.
element(by.id(''add-stuff-button'')).click();
// This does not matter fails on the line above..
expect(browser.getTitle()).toBeDefined();
});
});
El error:
UnknownError: unknown error: Element is not clickable at point (720, 881). Other element would receive the click: <div class="col-md-5 col-md-offset-5">...</div>
(Session info: chrome=37.0.2062.124)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.1 SP1 x86_64)
Pensamientos
El chromedriver encuentra el botón, porque si cambio el id, se queja de que no se encuentra ningún elemento. Así que creo que el problema es que el botón se mueve desde su posición inicial. Como la función del elemento (***) debe esperar a que se realice el angular, sospecho que son los complementos de terceros los que podrían interferir, ya que podrían no utilizar los datos de búsqueda de los angulos angulares, etc. Así que angular cree que está hecho pero luego el complemento del tercero Rellena y mueve cosas.
¿Alguna idea de qué hacer? Si el problema es el de los enchufes de terceros, ¿puedo decir de alguna manera a Angular que las cosas de terceros están sucediendo y luego decirle cuándo se hace?
Thx Br Twd
De la respuesta de ,
Debe establecer el tamaño de la ventana en su archivo de configuración
onPrepare: function() {
browser.manage().window().setSize(1600, 800);
}
Si aún no funciona, debería desplazarse a la ubicación del elemento.
browser.executeScript(''window.scrollTo(720, 881);'');
element(by.id(''add-stuff-button'')).click();
De otra manera, puedes probar esto:
this.setScrollPage = function (element) {
function execScroll() {
return browser.executeScript(''arguments[0].scrollIntoView()'',
element.getWebElement())
}
browser.wait(execScroll, 5000);
element.click();
};
Debe establecer el tamaño de la ventana en su archivo de configuración
onPrepare: function() {
browser.manage().window().setSize(1600, 1000);
}
Esto funciona mejor que especificar el tamaño de la ventana, en caso de que la prueba deba ejecutarse en varias pantallas.
browser.manage().window().maximize();
Esto sucede si la ventana de Chrome es demasiado pequeña, intente agregar dentro del antes de cada
browser.driver.manage().window().setSize(1280, 1024);
O simplemente use la clase de Acciones:
browser.actions().mouseMove(elem).click().perform();
Siguiendo funcionó bien para mí:
browser.actions().mouseMove(element).click();
Tal vez no sea aplicable en su caso, pero he encontrado el mismo problema y, según la respuesta de Milena , he estado buscando otro elemento que oculte mi botón (en mi caso, un menú desplegable en la parte superior derecha de mi pantalla). ).
Parece ser el mensaje de notificación Conectado a la sincronización del navegador enviado por browsersync , lanzado por Gulp . El mensaje desapareció después de un corto tiempo, pero después de mi llamada onClick ().
Para eliminar la notificación, en mi gulpfile, he agregado la notificación: parámetro falso al inicializar browsersync:
browser.driver.sleep(3000)
También puede intentar desactivar las herramientas de depuración que esté utilizando. Estaba usando Laravel y debugbar y tuve que configurar APP_DEBUG en falso.
Tenía el mismo problema pero no estaba relacionado con el tamaño de la ventana, pero tuvo que esperar a que ngAnimation terminara.
Así que tuve que esperar hasta que se pudiera hacer clic con el elemento.
const msg = ''Waiting for animation timeout after 1s'';
const EC = new protractor.ProtractorExpectedConditions();
await browser.wait(EC.elementToBeClickable(model.elements.button.checkCompliance), 1000, `${msg} panel`);
await model.elements.button.checkCompliance.click();
@note - Estoy usando la función async / await node 8, también podría convertir esto en Promesas normales. También utilizando ProtractorExpectedConditions
lugar de ExpectedConditions
ver documentación
Tenga en cuenta que esto fue causado en algún momento por una barra de navegación superior o barra de navegación inferior / barra de advertencia de cookies que cubre el elemento. Con el ángulo 2, al hacer clic en él se desplaza hasta que el elemento está solo en la página. Eso significa que cuando se desplaza hacia abajo para hacer clic en algo, si hay una navegación inferior, esto obstruirá el clic. Del mismo modo, cuando se desplaza hacia arriba, puede ser cubierto por la navegación superior.
Por ahora, para sortear el desplazamiento hacia arriba, estoy usando lo siguiente:
browser.refresh();
browser.driver.sleep(3000);
Me aseguré de quitar la barra inferior haciendo clic para cerrarla antes de comenzar la prueba.
Tuve el mismo error y el ajuste del tamaño de la pantalla no me lo solucionó.
Tras una inspección adicional, parecía que otro elemento estaba ocultando el botón, por lo tanto, la prueba de Selenium falló porque el botón no estaba (y no se pudo) hacer clic. Tal vez es por eso que ajustar el tamaño de la pantalla lo arregla para algunos?
Lo que reparó la mina fue eliminar el otro elemento (y luego ajustar la posición del mismo).