Webdriverio: moverPara alternativa?

Criado em 12 jun. 2017  ·  27Comentários  ·  Fonte: webdriverio/webdriverio

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?

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

Todos 27 comentários

Você provavelmente terá que usar a API de ação, se publicada. Por favor, junte-se ao nossoGitter para este tipo de perguntas. Isso não é um problema necessário.

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

grofit picture grofit  ·  4Comentários

sarahdayan picture sarahdayan  ·  4Comentários

LaiaPR picture LaiaPR  ·  4Comentários

KOPTE3 picture KOPTE3  ·  3Comentários

christian-bromann picture christian-bromann  ·  3Comentários