O elemento transferidor AngularJS by.model não consegue encontrar o elemento?
-
21-12-2019 - |
Pergunta
usando a sintaxe element(by.model()) para encontrar um campo e inserir texto.
element(by.model('sample_ad.id')).sendKeys('batman');
obtém a exceção do chromedriver:
Stacktrace:
Error: Timed out waiting for Protractor to synchronize with the page after 11 seconds
at Error (<anonymous>)
==== async task ====
WebDriver.executeScript()
at Protractor.waitForAngular (/Users/jon/dev/project_name/node_modules/protractor/lib/protractor.js:278:22)
at Protractor.findElement (/Users/jon/dev/project_name/node_modules/protractor/lib/protractor.js:427:8)
at Object.elementFinder.(anonymous function) [as sendKeys] (/Users/jon/dev/project_name/node_modules/protractor/lib/protractor.js:62:21)
at null.<anonymous> (/Users/jon/dev/project_name/test/e2e/features/somedirectiveSpec.js:24:39)
at /Users/jon/dev/project_name/node_modules/protractor/jasminewd/index.js:54:12
==== async task ====
at null.<anonymous> (/Users/jon/dev/project_name/node_modules/protractor/jasminewd/index.js:53:12)
at null.<anonymous> (/Users/jon/dev/project_name/node_modules/protractor/node_modules/minijasminenode/lib/async-callback.js:45:37)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Não sei por que isso está quebrando, mas o Transferidor parece muito frágil agora... Não tenho problemas ao usar o objeto do navegador para encontrar elementos, inserir texto, etc.
Qualquer ajuda seria apreciada
EDITAR:se eu alterar a linha para o seguinte, poderei interagir com o campo de texto.navegador.driver.findElement(transferidor.By.id('sample_ad_id')).sendKeys('batman');
Solução
para obter mais informações sobre tempos limite.
Outras dicas
espero que isso ajude os outros ....
Encontrei isso no github (veja o link de referências).Acredito que o problema seja um script que não retorna, portanto os sendKeys não funcionaram.Antes de interagir com o dom usando objetos transferidores (element, ptor, etc), defina esta variável:
navegador.ignoreSynchronization=true;
A razão pela qual o seguinte funciona é porque ele não depende de chamadas assíncronas, apenas interage diretamente com o dom e insere as chaves no campo de entrada.navegador.driver.findElement(transferidor.By.id('sample_ad_id')).sendKeys('batman');
O motivo pelo qual minha ligação não funcionou (Eu acredito) é porque houve uma chamada assíncrona que não retornou a tempo.
element(by.model('sample_ad.id')).sendKeys('batman');
referências:https://github.com/angular/protractor/issues/325
Parece que seu teste está expirando.O tempo limite padrão para o transferidor é de 11 segundos.
Tente definir um tempo limite diferente para este teste:
it('should override timeout', function() {
// Timeout of 30 seconds.
element(by.model('sample_ad.id')).sendKeys('batman');
}, 30000)
Você também pode substituir o tempo limite de todos os seus testes no arquivo de configuração do transferidor.Veja este exemplo de arquivo de configuração:
https://github.com/andresdominguez/protractor-meetup/blob/master/protractor-config.js#L19
// Inside the protractor config file.
onPrepare: function() {
// Override the timeout for webdriver.
var ptor = protractor.getInstance();
ptor.driver.manage().timeouts().setScriptTimeout(60000);
}