Estou tentando selecionar uma opção em uma lista suspensa para os testes do e2e angular usando transferidor.
Aqui está o snippet de código da opção de seleção:
<select id="locregion" class="create_select ng-pristine ng-invalid ng-invalid-required" required="" ng-disabled="organization.id !== undefined" ng-options="o.id as o.name for o in organizations" ng-model="organization.parent_id">
<option value="?" selected="selected"></option>
<option value="0">Ranjans Mobile Testing</option>
<option value="1">BeaverBox Testing</option>
<option value="2">BadgerBox</option>
<option value="3">CritterCase</option>
<option value="4">BoxLox</option>
<option value="5">BooBoBum</option>
</select>
Eu tentei:
ptor.findElement(protractor.By.css('select option:1')).click();
Isso me dá o seguinte erro:
Uma string inválida ou ilegal foi especificada Informações de compilação: versão: '2.35.0', revisão: 'c916b9d', hora: '2013-08-12 15:42:01' Informações do sistema: os.name: 'Mac OS X' , os.arch: 'x86_64', os.version: '10 .9 ', java.version:' 1.6.0_65 'Informações do driver: driver.version: desconhecido
Eu também tentei:
ptor.findElement(protractor.By.xpath('/html/body/div[2]/div/div[4]/div/div/div/div[3]/ng-include/div/div[2]/div/div/organization-form/form/div[2]/select/option[3]')).click();
Isso me dá o seguinte erro:
ElementNotVisibleError: O elemento não está visível no momento e, portanto, não pode interagir com a duração do comando ou tempo limite: 9 milissegundos Informações da versão: versão: '2.35.0', revisão: 'c916b9d', hora: '2013-08-12 15:42: 01 'Informações do sistema: os.name:' Mac OS X ', os.arch:' x86_64 ', os.version: '10 .9', java.version: '1.6.0_65' ID da sessão: bdeb8088-d8ad-0f49-aad9 -82201c45c63f Informações do driver: org.openqa.selenium.firefox.FirefoxDriver Capabilities [{platform = MAC, acceptSslCerts = true, javascriptEnabled = true, browserName = firefox, rotatable = false, locationContextEnabled = true, version = 24.0, cssSelectorsEnabled = true, banco de dados = true, handlesAlerts = true, browserConnectionEnabled = true, nativeEvents = false, webStorageEnabled = true, applicationCacheEnabled = false, takesScreenshot = true}]
Alguém pode me ajudar com este problema ou lançar alguma luz sobre o que posso estar fazendo de errado aqui.
fonte
Para mim funcionou como um encanto
Espero que ajude.
fonte
ElementFinder
é capaz de acorrentar, então você pode fazer:element(by.css('.specific-select')).element(by.cssContainingText('option', 'BeaverBox Testing')).click();
Uma abordagem elegante envolveria fazer uma abstração semelhante ao que outras associações de linguagem selenium oferecem fora da caixa (por exemplo,
Select
classe em Python ou Java).Vamos fazer um wrapper conveniente e ocultar os detalhes de implementação dentro:
Exemplo de uso (observe como é legível e fácil de usar):
Solução retirada do seguinte tópico: Selecione -> abstração de opção .
FYI, criou uma solicitação de recurso: Select -> option abstraction .
fonte
click()
. Obrigado.fonte
Para acessar uma opção específica, você precisa fornecer o seletor nth-child ():
fonte
Foi assim que fiz minha seleção.
fonte
Veja como eu fiz:
fonte
waitForAngular()
método do transferidor .Experimente isso, está funcionando para mim:
fonte
Você pode tentar isso espero que funcione
fonte
Outra maneira de definir um elemento de opção:
fonte
Para selecionar itens (opções) com ids exclusivos como aqui:
Estou usando este:
fonte
Escrevemos uma biblioteca que inclui 3 maneiras de selecionar uma opção:
O recurso adicional dessas funções é que elas esperam que o elemento seja exibido antes que qualquer ação
select
seja executada.Você pode encontrá-lo em npm @ hetznercloud / protractor-test-helper . As tipificações para TypeScript também são fornecidas.
fonte
Talvez não seja super elegante, mas eficiente:
Isso apenas envia a chave para o select que você deseja, no nosso caso, estamos usando modelSelector, mas obviamente você pode usar qualquer outro seletor.
Então, em meu modelo de objeto de página:
E do teste:
fonte
O problema é que as soluções que funcionam em caixas de seleção angulares regulares não funcionam com a seleção e a opção md Angular Material usando transferidor. Este foi postado por outro, mas funcionou para mim e não posso comentar sobre sua postagem ainda (apenas 23 pontos de repetição). Além disso, eu limpei um pouco, em vez de browser.sleep, usei browser.waitForAngular ();
fonte
element(by.model('selectModel')).click(); element(by.css('md-option[value="searchOptionValue"]')).click();
mdSelectElement.getAttribute('aria-owns').then( function(val) { let selectMenuContainer = element(by.id(val)); selectMenuContainer.element(by.css('md-option[value="foo"]')).click(); } );
Há um problema com a seleção de opções no Firefox que o hack do Droogans corrige e que desejo mencionar aqui explicitamente, esperando que isso possa evitar que alguém tenha problemas: https://github.com/angular/protractor/issues/480 .
Mesmo se seus testes estiverem passando localmente com o Firefox, você pode descobrir que eles estão falhando no CircleCI ou TravisCI ou em qualquer outra coisa que você esteja usando para CI e implantação. Estar ciente desse problema desde o início teria me poupado muito tempo :)
fonte
Ajudante para definir um elemento de opção:
fonte
Se abaixo está o menu suspenso fornecido-
Então o código do transferidor pode ser-
Source- https://github.com/angular/protractor/issues/600
fonte
Selecione a opção por índice:
fonte
Melhorei um pouco a solução escrita por PaulL. Em primeiro lugar, corrigi o código para ser compatível com a última API do Protractor. E então eu declaro a função na seção 'onPrepare' de um arquivo de configuração do Protractor como um membro da instância do navegador , para que possa ser referenciado a partir de qualquer especificação e2e.
fonte
Tenho pesquisado na rede uma resposta sobre como selecionar uma opção em um menu suspenso de modelos e usei essa combinação que me ajudou com o material Angular.
parece que, ao lançar o código todo em uma linha, ele poderia encontrar o elemento no menu suspenso.
Demorou muito para essa solução, espero que isso ajude alguém.
fonte
Queríamos usar a solução elegante usando o material angularjs, mas ela não funcionou porque não há, na verdade, nenhuma tag de opção / md-opção no DOM até que o md-select tenha sido clicado. Portanto, a maneira "elegante" não funcionou para nós (observe o material angular!) Aqui está o que fizemos por ela, não sei se é a melhor maneira, mas está definitivamente funcionando agora
Precisávamos ter 4 selects selecionados e enquanto o select estiver aberto, há uma sobreposição na forma de selecionar o próximo select. é por isso que precisamos esperar 500ms para garantir que não tenhamos problemas com os efeitos materiais ainda em ação.
fonte
Outra maneira de definir um elemento de opção:
fonte
fonte
Você pode selecionar opções suspensas por valor:
$('#locregion').$('[value="1"]').click();
fonte
Aqui está como fazer isso por valor de opção ou índice . Este exemplo é um pouco grosseiro, mas mostra como fazer o que você quer:
html:
ts:
fonte
fonte
Podemos criar uma classe DropDown personalizada para isso e adicionar um método como:
Além disso, para verificar qual valor está selecionado atualmente, podemos ter:
fonte
O exemplo abaixo é a maneira mais fácil. Eu testei e passei na versão do transferidor
5.4.2
Código completo
fonte
Esta é uma resposta simples de uma linha na qual o angular tem um localizador especial que pode ajudar a selecionar e indexar da lista.
fonte
Selecione a opção por propriedade CSS
ou
Onde locregion (id), organization.parent_id (nome do modelo) são os atributos do elemento selecionado.
fonte