Webdriverio: setValue () não limpa a entrada antes de definir um novo valor

Criado em 2 mar. 2016  ·  35Comentários  ·  Fonte: webdriverio/webdriverio

No meu caso de teste, tenho uma etapa em que o novo valor é definido como uma entrada não vazia (com o número do tipo). De acordo com a API webdriverIO, o método setValue deve limpar uma entrada primeiro e, em seguida, digitar um novo valor. Mas no meu caso, setValue acrescenta um novo valor ao existente.

Estou usando o webdriverIO 3.4.0 com servidor autônomo Selenium 2.52.0 e Firefox 44.0.2. Os formulários em meu aplicativo em teste são criados com a biblioteca React.js.

Bug🐛 Question Selenium Related

Comentários muito úteis

Caso outras pessoas estejam tendo esse problema, aqui está a solução que encontrei:

let valueLength = browser.getValue(id).length
let backSpaces = new Array(valueLength).fill('Backspace')
browser.setValue(id, backSpaces)

A solução que @jkwaldrip ofereceu funcionou para mim, mas era muito lenta. Isso retrocede tão rápido quanto a digitação normal.

Alguém pode confirmar se este é realmente um problema do chromedriver e como o determinaram?

Todos 35 comentários

Você poderia postar os logs de selênio daquela parte onde você usa setValue?

Claro, aqui está aquela parte do registro de selênio:

12:16:04.077 INFO - Done: [clear: 17 [[FirefoxDriver: firefox on WINDOWS (2009724f-387c-4e20-8dc2-92df612798a8)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]]]
12:16:04.081 INFO - Executing: [send keys: 17 [[FirefoxDriver: firefox on WINDOWS (2009724f-387c-4e20-8dc2-92df612798a8)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]], [5]])
12:16:04.104 INFO - Done: [clear: 18 [[FirefoxDriver: firefox on WINDOWS (2009724f-387c-4e20-8dc2-92df612798a8)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]]
12:16:04.110 INFO - Executing: [send keys: 18 [[FirefoxDriver: firefox on WINDOWS (2009724f-387c-4e20-8dc2-92df612798a8)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]], [5]])
12:16:04.135 INFO - Done: [clear: 19 [[FirefoxDriver: firefox on WINDOWS (2009724f-387c-4e20-8dc2-92df612798a8)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]]]
12:16:04.140 INFO - Executing: [send keys: 19 [[FirefoxDriver: firefox on WINDOWS (2009724f-387c-4e20-8dc2-92df612798a8)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]], [1, 0]])

Estou vendo o mesmo problema. As entradas não são apagadas (nem com setValue () e nem com clearElement ()). Novos valores são acrescentados.

12:41:57.165 INFO - Executing: [find elements: By.cssSelector: input[name=email]])
12:41:57.183 INFO - Done: [find elements: By.cssSelector: input[name=email]]
12:41:57.191 INFO - Executing: [clear: 3 [[ChromeDriver: chrome on MAC (1f3151b777f3aaf6b39852c72fc62d1a)] -> css selector: input[name=email]]])
12:41:57.219 INFO - Done: [clear: 3 [[ChromeDriver: chrome on MAC (1f3151b777f3aaf6b39852c72fc62d1a)] -> css selector: input[name=email]]]
12:41:57.227 INFO - Executing: [send keys: 3 [[ChromeDriver: chrome on MAC (1f3151b777f3aaf6b39852c72fc62d1a)] -> css selector: input[name=email]], [t, e, s, t, @, t, e, s, t, ., t, e, s, t]])
12:41:57.295 INFO - Done: [send keys: 3 [[ChromeDriver: chrome on MAC (1f3151b777f3aaf6b39852c72fc62d1a)] -> css selector: input[name=email]], [t, e, s, t, @, t, e, s, t, ., t, e, s, t]]

Estou usando o webdriverio 4.0.3 e o mercúrio para renderizar o html.

Parece que o comando foi executado com sucesso. Então, parece ser um problema do Chromedriver.

Enfrentou o mesmo problema. A entrada não foi limpa com clearElement () nem setValue ().

No entanto, começa a funcionar para mim quando clico na entrada ou escrevo algo antes de limpar (estou usando cucumberjs - e por algum motivo estranho não funciona quando clico / escrevo na mesma etapa, mas funciona bem se eu fizer isso na etapa anterior).

PS Estou usando selênio: "2.48.2", chromedriver: "2.20", webdriverio: "2.4.5". ReactJS.

Você poderia atualizar o servidor autônomo de selênio e tentar novamente?

@adolatowska Acabei de executar um teste simples (veja abaixo) com a mesma versão do webdriverio, mesmo servidor autônomo de selênio, mas FF diferente (45.0.1) e funciona bem para mim. Para sua informação, @ christian-bromann

var webdriverio = require('../webdriverio');
var options = {
    desiredCapabilities: {
        browserName: 'firefox'
    }
};

webdriverio
    .remote(options)
    .init()
    .url('http://www.google.co.uk')
    .setValue('#lst-ib', 'test')
    .pause(5000)
    .setValue('#lst-ib', 'arek')
    .pause(5000)
    .end();

Selenoum Logs abaixo

14:05:56.883 INFO - Selenium Server is up and running
14:06:03.154 INFO - Executing: [new session: Capabilities [{rotatable=true, locationContextEnabled=true, loggingPrefs=org.openqa.selenium.logging.LoggingPreferences<strong i="12">@6de9b74d</strong>, browserName=firefox, javascriptEnabled=true, handlesAlerts=true, version=, platform=ANY, requestOrigins={name=webdriverio, version=3.4.0, url=http://webdriver.io}}]])
14:06:03.171 INFO - Creating a new session for Capabilities [{rotatable=true, locationContextEnabled=true, loggingPrefs=org.openqa.selenium.logging.LoggingPreferences<strong i="13">@6de9b74d</strong>, browserName=firefox, javascriptEnabled=true, handlesAlerts=true, version=, platform=ANY, requestOrigins={name=webdriverio, version=3.4.0, url=http://webdriver.io}}]
14:06:06.831 INFO - Done: [new session: Capabilities [{rotatable=true, locationContextEnabled=true, loggingPrefs=org.openqa.selenium.logging.LoggingPreferences<strong i="14">@6de9b74d</strong>, browserName=firefox, javascriptEnabled=true, handlesAlerts=true, version=, platform=ANY, requestOrigins={name=webdriverio, version=3.4.0, url=http://webdriver.io}}]]
14:06:06.852 INFO - Executing: [get: http://www.google.co.uk])
14:06:08.377 INFO - Done: [get: http://www.google.co.uk]
14:06:08.410 INFO - Executing: [find elements: By.id: lst-ib])
14:06:08.514 INFO - Done: [find elements: By.id: lst-ib]
14:06:08.530 INFO - Executing: [clear: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib]])
14:06:08.623 INFO - Done: [clear: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib]]
14:06:08.633 INFO - Executing: [send keys: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib], [t, e, s, t]])
14:06:08.716 INFO - Done: [send keys: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib], [t, e, s, t]]
14:06:13.729 INFO - Executing: [find elements: By.id: lst-ib])
14:06:13.741 INFO - Done: [find elements: By.id: lst-ib]
14:06:13.750 INFO - Executing: [clear: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib]])
14:06:13.780 INFO - Done: [clear: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib]]
14:06:13.787 INFO - Executing: [send keys: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib], [a, r, e, k]])
14:06:13.851 INFO - Done: [send keys: 0 [[FirefoxDriver: firefox on MAC (5649de47-170c-d74d-b813-018cfa7da030)] -> id: lst-ib], [a, r, e, k]]
14:06:18.861 INFO - Executing: [delete session: f39e1174-0b7a-42b2-9d9d-1ac3505416f8])
14:06:19.596 INFO - Done: [delete session: f39e1174-0b7a-42b2-9d9d-1ac3505416f8]

Eu testei novamente com Selenium Standalone versão 2.53.0 e ambas as versões FF: 45.0.1 e 45.0.2. A situação é a mesma. Aqui está o log do Selenium executado no FF v.45.0.1:


> 19:26:55.659 INFO - Executing: [clear: 22 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]]])
> 19:26:55.664 INFO - Done: [find elements: By.xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]
> 19:26:55.671 INFO - Executing: [clear: 23 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]])
> 19:26:55.677 INFO - Done: [find elements: By.xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]]
> 19:26:55.684 INFO - Executing: [clear: 24 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]]])
> 19:26:55.700 INFO - Done: [clear: 22 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]]]
> 19:26:55.704 INFO - Executing: [send keys: 22 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]], [5]])
> 19:26:55.721 INFO - Done: [clear: 23 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]]
> 19:26:55.726 INFO - Executing: [send keys: 23 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]], [5]])
> 19:26:55.741 INFO - Done: [clear: 24 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony prioryteto
> wy"]/../..//input)[3]]]
> 19:26:55.745 INFO - Executing: [send keys: 24 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]], [1, 0]])
> 19:26:55.780 INFO - Done: [send keys: 22 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]], [5]]
> 19:26:55.814 INFO - Done: [send keys: 23 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]], [5]]
> 19:26:55.859 INFO - Done: [send keys: 24 [[FirefoxDriver: firefox on WINDOWS (c9c978bb-acc5-4693-a830-5676e4c0b35d)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]], [1, 0]]

e aqui está o log da execução no FF v. 45.0.2:


> 19:31:35.154 INFO - Executing: [clear: 22 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]]])
> 19:31:35.160 INFO - Done: [find elements: By.xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]
> 19:31:35.165 INFO - Executing: [clear: 23 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]])
> 19:31:35.176 INFO - Done: [find elements: By.xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]]
> 19:31:35.181 INFO - Executing: [clear: 24 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]]])
> 19:31:35.199 INFO - Done: [clear: 22 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]]]
> 19:31:35.204 INFO - Executing: [send keys: 22 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]], [1, 0]])
> 19:31:35.219 INFO - Done: [clear: 23 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]]]
> 19:31:35.223 INFO - Executing: [send keys: 23 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]], [5]])
> 19:31:35.239 INFO - Done: [clear: 24 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]]]
> 19:31:35.244 INFO - Executing: [send keys: 24 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]], [5]])
> 19:31:35.298 INFO - Done: [send keys: 22 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony priorytetowy"]/../..//input)[3]], [1, 0]]
> 19:31:35.337 INFO - Done: [send keys: 23 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="List polecony ekonomiczny"]/../..//input)[3]], [5]]
> 19:31:35.372 INFO - Done: [send keys: 24 [[FirefoxDriver: firefox on WINDOWS (a1c5eedb-cbcb-40af-8c64-142651c20683)] -> xpath: (//button[.="Przesy?ka kurierska"]/../..//input)[3]], [5]]

@adolatowska / @ christian-bromann sou só eu ou "claro" enviar para (//button[.="Przesy?ka kurierska "] /../..// input) [3]]]) mas " enviar keys " para (//button[.="Przesy?ka kurierska"] /../..// input) [3]]

Observe o "]" extra no comando claro no final. Isso explicaria por que não está esclarecendo os valores.

@adolatowska você pode tentar usar um seletor diferente?

Fechando por inatividade. Estou feliz em abrir novamente, se ainda for válido.

Eu também tenho o mesmo problema com FF 47-49

Estou tendo o mesmo problema com Firefox 53.0.2 e Chrome 58.0.3029.110 e selênio-standalone 6.4.1. Estou testando em um aplicativo React, se isso ajudar em tudo.

Estou adicionando uma resolução aqui e no # 891 para a solução alternativa que usei. Parece que nosso React DOM não está sendo atualizado sempre que um elemento é limpo com .clearElement () e, em seguida, definido novamente com .setValue (), então tive que retroceder no campo um caractere por vez:

let x = browser.getValue(selector);
for (let i = 0; i < x.length; i++) { browser.setValue(selector, "\uE003").pause(100); };
browser.setValue(selector, newValue);

@jkwaldrip Esta solução alternativa não funcionou para mim. Usamos react-redux para nosso front end e usando setValue o valor é sempre acrescentado, mesmo se eu limpar o campo usando clearElement (). ou com backspaces conforme fornecido em seu código acima. Alguma outra etapa que posso tentar?

Ainda houve alguma solução. Ainda estou vendo o mesmo problema. Aqui está minha configuração

"wdio-chromedriver-service": "^0.1.2",
"webdriverio": "^4.8.0"

selenium-server-standalone-2.53.1.jar

O mesmo problema aqui.
Selenium Server 3.14.0
Chromedriver 2.41

Mesmo problema reintroduzido aqui após a atualização para o Chromedriver 2.43 - agora você precisa confiar na sugestão de @jkwaldrip com retrocesso.

Por favor, tente isso, funcionou para mim
Precisamos primeiro colocar o foco no elemento, depois limpá-lo e escrever coisas nele.

.click('input[aria-label=Login]') // Workaround to make .clearValue() possible.
.clearValue('input[aria-label=Login]') // Without clearValue() the value would be appended.
.setValue('input[aria-label=Login]', 'new_value')

Foi o que fiz até hoje, onde atualizei para o Chromedriver mais recente, e ele parou de funcionar.

Eu posso confirmar isso.
Por favor, reabra o relatório de bug.

@ MartinX3 você pode provar que esse bug está relacionado ao WebdriverIO? setValue não mudou na última vez, então parece que o Chrome introduziu essa regressão.

Oh, você pode nos ajudar fornecendo um link onde colocar esta solicitação de bug?

Continuo meu trabalho com selênio na próxima semana.

Comecei a enfrentar esse problema também para o aplicativo Rea desde que atualizei
"wdio-selenium-standalone-service": de "0.0.10" a "0.0.11".

Caso outras pessoas estejam tendo esse problema, aqui está a solução que encontrei:

let valueLength = browser.getValue(id).length
let backSpaces = new Array(valueLength).fill('Backspace')
browser.setValue(id, backSpaces)

A solução que @jkwaldrip ofereceu funcionou para mim, mas era muito lenta. Isso retrocede tão rápido quanto a digitação normal.

Alguém pode confirmar se este é realmente um problema do chromedriver e como o determinaram?

eu posso encontrar uma boa solução. então ... eu consegui

 browser.addCommand("clearValue2", async function () {
            let valueLength = this.getValue().length
            let backSpaces = new Array(valueLength).fill('Backspace')
            this.setValue(backSpaces)

        }, true);
        browser.addCommand("setValue2", async function (val) {
            this.clearValue2();
            this.setValue(val)
        }, true);

Mesmo problema para:

"webdriverio": "5.7.15"

Se você usar:

selector.click()
selector.clearValue()
selector.setValue()

clearValue() também é ignorado e você tem o mesmo problema.

Para lidar com esse problema, encontrei esta solução e funciona para mim:

selector.doubleClick() //selects the text written in the input
browser.keys("Delete") //removes old value
selector.setValue() //sets new Value
1. in WebdriverIO v4, i tried to edit the text field by clear text (which contains special charactes like @, +, _) in text field by below following step. Eventhough it was not successful.

example: text=> [email protected]

step1:browser.clearElement(selector);

step2:browser.execute(function () {
            document.querySelector(>>>Cssselector<<<).value="";
        });

step3: browser.doubleClick(selector);
       browser.keys("Delete");

step4: browser.click(selector);
       browser.keys(['Meta',a]);
       browser.keys('Meta');
       browser.keys('Delete');

Note: below step is resolved this issue.

var count= browser.getAttribute(selector, value).length;
for (var i=0;i<count;i++)
{
if (browser.getAttribute(selector, value)=='')
break;
}
else
{
browser.doubleClick(selector);
browser.keys("Delete");
}
browser.pause(200);

// limpará seu campo de texto facilmente.

Nota: Você pode adicionar novo texto nesse campo de texto.

Só quero deixar meus dois centavos sobre isso, já que as coisas acima nunca funcionaram. Fiz uma função de utilidade e passei no elemento (com TypeScript).

export const deleteValue = async (browser: TestBrowser, selector: WebdriverIOAsync.Element) => {
    const value = await selector.getValue()
    const count = value.length
    for (var i=0;i<count;i++) {
        await selector.click();
        await browser.keys(['Meta', 'a']);
        await browser.keys(['Backspace']);
    }
    /*Modifier like Ctrl, Shift, Alt and Meta will stay pressed so you need to trigger them again to release them.*/
    await browser.keys(['Meta', 'a']);
    await browser.pause(200);
}

e eu passo assim ...

const nameInput = await browser.$(`input[name=name]`);
await deleteValue(browser, nameInput);
await nameInput.setValue('John Doe');

Obtendo o mesmo problema aqui. Quando há um valor definido para a entrada, a função de limpeza falha (não importa se o foco está definido na entrada). Mas se não houver um valor padrão e digitarmos AND e limparmos, isso funciona.

@NBukuri sua solução só funciona para entradas que não contenham caracteres especiais.

@defusiner
para coisas de caracteres especiais, tente obter o comprimento desse campo de entrada específico. aplique loop para excluir clicando duas vezes no campo de texto até text == ""

var count = browser.getAttribute (seletor, valor) .length;
para (var i = 0; i {
if (browser.getAttribute (seletor, valor) == '')
pausa;
}
outro
{
browser.doubleClick (seletor);
browser.keys ("Excluir");
}
browser.pause (200);

agora envie o valor de entrada para o campo de texto correspondente.
this.inputfield.setValue (inputValue)

@Rajendiransivaprasath

Fizemos exatamente assim. Queria apenas mencionar que o duplo clique não funciona quando há mais de 1 palavra ou caracteres especiais na entrada.

Lutei com isso por um tempo e escrevi uma solução estranha.

function clearInputValue(inputElement) { while (inputElement.getValue() !== '') { inputElement.doubleClick(); browser.keys('Delete'); inputElement.clearValue(); } }

Quando eu executo os testes em meu Mac (local) clearValue () está funcionando bem, mas quando os mesmos testes são executados no ambiente Docker do Linux (circleci / node: 10-buster-browsers-legacy), preciso usar a solução alternativa que @ bob-laz mencionou. Poderia ser melhor se o mesmo fosse corrigido para o ambiente Linux também.

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