Tentando usar leftClick
ou moveTo
ou moveToObject
recebo este aviso:
WARNING: the "moveTo" command will be deprecated soon. Please use a different command in order to avoid failures in your test after updating WebdriverIO.
Quais são as alternativas? Por que moveTo
foi substituído?
Eu gostaria de responder a essa questão de alternativas até que a API Action seja implementada. Passei o dia todo na Gitter e ninguém parece ter uma solução.
Não há
Existe um cronograma aproximado quando a API Action será implementada para webdriverio?
Quando Geckodriver e Chromedriver o suportam totalmente
Por que algo está obsoleto quando ainda não há alternativa? Não é um pouco cedo para um aviso de suspensão de uso, então?
Por que algo está obsoleto quando ainda não há alternativa?
Existe uma alternativa, mas não é suportada pelo driver do navegador.
Não é um pouco cedo para um aviso de suspensão de uso, então?
Em retrospectiva, foi errado adicionar os avisos de depreciação para todos os navegadores, visto que apenas o Firefox foi afetado. Vou atualizar isso em breve. Se as mensagens de erro forem muito detalhadas, use a versão v4.7.x
recente.
Se as mensagens de erro forem muito detalhadas, use a versão mais recente v4.7.x
Legal então, vou continuar usando a v4.7.x enquanto presto atenção neste tópico para atualizações. Obrigado
Então, para ser claro, moveToObject irá falhar no Firefox?
Então, para ser claro, moveToObject irá falhar no Firefox?
Sim, você precisa usar o comando de ações!
Aqui está uma implementação do moveToObject, que funcionou para nós no Chrome e no Firefox, com base no protocolo de ações.
browser.addCommand('moveToElement', function(selector, x, y) {
if (this.desiredCapabilities.browserName === 'firefox') {
return this.getLocation(selector)
.then(function(location) {
// setting mouse position to the top-left corner of the browser, see this idea of <strong i="6">@mhemesath</strong> on gitter
// https://gitter.im/webdriverio/webdriverio?at=5a24be23cc1d527f6be94b49
return this.execute(function () {
// eslint-disable-next-line no-var
var div = document.createElement('div');
document.body.appendChild(div);
div.id = 'wdioMouseReset';
div.style.position = 'absolute';
div.style.top = 0;
div.style.left = 0;
div.style.width = '1px';
div.style.height = '1px';
div.style.zIndex = '9999999';
// eslint-disable-next-line func-names, prefer-arrow-callback
div.addEventListener('click', function () {
document.body.removeChild(div);
})
})
.click('#wdioMouseReset')
.actions(
[{
"type": "pointer",
"id": "finger1",
"parameters": {"pointerType": "mouse"},
"actions": [
{"type": "pointerMove", "duration": 0, "x": location.x + 2, "y": location.y + 2}
]
}]
)
});
} else {
return this.moveToObject(selector, x, y);
}
});
Estranho, isso funciona bem para mim no Chrome localmente, mas falha quando é executado no SauceLabs.
Edit: O que quer dizer, moveToObject
não funciona em SauceLabs. Além disso, o Firefox não pareceu gostar da abordagem Actions no SauceLab, mas eu não fui capaz de testá-lo localmente para ter um like-for-like com o Chrome.
Aqui está uma implementação do moveToObject, que funcionou para nós no Chrome e no Firefox, com base no protocolo de ações.
Se o protocolo de ações for suportado, você deve ser capaz de usá-lo para mover o mouse para (0,0) na janela de exibição, ou não, se necessário. O hack de injeção de div só foi usado porque a API de ações ainda não era compatível com o Chrome para mim e eu não queria depender de uma API obsoleta.
Achei que as coordenadas xey da ação seriam relativas à posição atual do mouse, é por isso que usei sua abordagem para defini-la como zero, mas vou tentar sem ela então.
Obrigado.
Se você leu o documento sobre ações , ele diz que a origem do pointerMove é padronizada para a janela de visualização se omitida.
Se o ponteiroMove:
duração: inteiro em ms
origin: (a) string, uma das viewport ou ponteiro, ou (b) um objeto que representa um elemento da web. O padrão é a janela de visualização se a origem for omitida.
x: inteiro, valor x para o qual mover, em relação à janela de visualização, ponteiro ou elemento com base na origem
y: inteiro, valor de y para o qual mover, em relação à janela de visualização, ponteiro ou elemento com base na origem
Se o ponteiroCancel: esta ação ainda não foi definida pela especificação
Verdade, do que deveria funcionar, obrigado!
E se quisermos clicar em uma determinada posição de deslocamento em um elemento? O método @gsanta mencionado acima funciona para mover o cursor para aquela posição, mas não pode clicar nessa posição.
Tentei despachar um evento de clique, mas não está claro para mim como especificar onde clicar. Alguém poderia ajudar nisso? Obrigado!
Você pode colocar várias ações na matriz de ações, simulando um movimento e, em seguida, um clique:
"actions": [
{"type": "pointerMove", "duration": 0, "x": 100, "y": 100},
{"type": "pointerDown", "button": 0},
{"type": "pause", "duration": 500},
{"type": "pointerUp", "button": 0}
]
@gsanta :
Sou um novato tentando descobrir como usar sua implementação. Você pode postar um código de exemplo sobre como usar esta implementação?
Pensei: Este parece ser um lugar muito bom para o webdriver fornecer um empacotador de API consistente para essas coisas. Como desenvolvedor, estou bem em passar para as coisas de ações se for necessário, mas ser capaz de fazer moveMouseTo
e funcionar independentemente do navegador que estou testando seria realmente incrível. Internamente, seria uma instrução switch aninhada no navegador para converter os comandos para a API do navegador com suporte.
Isso pode ser contornado como:
browser.selectorExecute(element.selector, function (elem) {
elem[0].scrollIntoView();
});
Parece que a API de ação no Chrome pode chegar em breve: https://bugs.chromium.org/p/chromedriver/issues/detail?id=1897
@mhemesath, essa é uma boa notícia
Por que moveTo e moveToObject ainda estão na documentação se eles não funcionam?
Se ficasse talvez um aviso de que não funciona com o firefox seria legal ...
http://webdriver.io/api/protocol/moveTo.html
http://webdriver.io/api/action/moveToObject.html
Me surpreendeu que ele fez, mas el.moveTo
parece funcionar para mim:
$('.header__yourMum').moveTo();
Surpreendeu-me que _disse_ mas
el.moveTo
parece funcionar para mim:$('.header__yourMum').moveTo();
funciona para o firefox?
@ ManikanthErukulla1 não tenho certeza, acabei de usar o Chrome até agora.
Comentários muito úteis
Por que moveTo e moveToObject ainda estão na documentação se eles não funcionam?
Se ficasse talvez um aviso de que não funciona com o firefox seria legal ...
http://webdriver.io/api/protocol/moveTo.html
http://webdriver.io/api/action/moveToObject.html