How to select a dynamic value in select2 dropdown for selenium

耗尽温柔 提交于 2019-12-25 01:33:15

问题


I am writing a test where data needs to be selected from a select2 drop down. Ajax call is fetching the data which can change according to scenario.

My solution works if i enter a hard coded value but that solution is not feasible for me

driver.findElement(By.id("select2-company-container")).click();
WebElement dropdown=driver.findElement(By.xpath("//ul[@id='select2-company-results']"));
driver.findElement(By.className("select2-search__field")).sendKeys("Einstein"+ Keys.ENTER);

I have tried the below code and some others as well but unable to get it running

driver.findElement(By.id("select2-company-container")).click(); //click on dropdown
driver.findElement(By.className("select2-results__option l1 non-leaf opened showme select2-results__option--highlighted")).click(); //select a value from drop down

Error message Cannot locate an element using class name=select2-results__option l1 non-leaf opened showme select2-results__option--highlighted For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03' System info: host: 'NX00528', ip: '10.28.84.135', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.

<span class="select2-container select2-container--default select2-container--open s2-to-tree" style="position: absolute; top: 97px; left: 302px;"><span class="select2-dropdown select2-dropdown--above" dir="ltr" style="width: 383px;"><span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="0" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox"></span><span class="select2-results"><ul class="select2-results__options" role="tree" id="select2-company-results" aria-expanded="true" aria-hidden="false"><li class="select2-results__option l1" id="select2-company-result-bjvi-96" role="treeitem" aria-selected="false" data-val="96"><span class="item-label">778678676
        </span></li><li class="select2-results__option l1" id="select2-company-result-t7b9-89" role="treeitem" aria-selected="false" data-val="89"><span class="item-label">ABC Test
        </span></li><li class="select2-results__option l1 non-leaf opened showme select2-results__option--highlighted" id="select2-company-result-rt5a-90" role="treeitem" aria-selected="false" data-val="90"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">ABC Test 1
        </span></li><li class="select2-results__option l2 showme" id="select2-company-result-4bcl-91" role="treeitem" aria-selected="false" data-val="91" data-pup="90"><span class="item-label">ABC Test 1-1
        </span></li><li class="select2-results__option l1 non-leaf opened showme" id="select2-company-result-xelm-1" role="treeitem" aria-selected="false" data-val="1"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">Einstein
        </span></li><li class="select2-results__option l2 non-leaf showme opened" id="select2-company-result-5820-16" role="treeitem" aria-selected="false" data-val="16" data-pup="1"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">E 1
        </span></li><li class="select2-results__option l3 non-leaf showme opened" id="select2-company-result-2ek9-60" role="treeitem" aria-selected="false" data-val="60" data-pup="16"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">E 1-1
        </span></li><li class="select2-results__option l4 non-leaf showme opened" id="select2-company-result-2bvx-61" role="treeitem" aria-selected="false" data-val="61" data-pup="60"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">E 1-1-1
        </span></li><li class="select2-results__option l5 non-leaf showme opened" id="select2-company-result-4ol9-65" role="treeitem" aria-selected="false" data-val="65" data-pup="61"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">E 1-1-1-1
        </span></li><li class="select2-results__option l6 showme" id="select2-company-result-gr72-66" role="treeitem" aria-selected="false" data-val="66" data-pup="65"><span class="item-label">E 1-1-1-1-1
        </span></li><li class="select2-results__option l3 showme" id="select2-company-result-95uo-62" role="treeitem" aria-selected="false" data-val="62" data-pup="16"><span class="item-label">E 1-1A
        </span></li><li class="select2-results__option l2 showme" id="select2-company-result-nfvb-63" role="treeitem" aria-selected="false" data-val="63" data-pup="1"><span class="item-label">E 1A
        </span></li><li class="select2-results__option l1 " id="select2-company-result-o60x-79" role="treeitem" aria-selected="false" data-val="79"><span class="item-label">For ClientShop
        </span></li><li class="select2-results__option l1 " id="select2-company-result-nq81-58" role="treeitem" aria-selected="false" data-val="58"><span class="item-label">New Company Test
        </span></li><li class="select2-results__option l1 " id="select2-company-result-x7t0-80" role="treeitem" aria-selected="false" data-val="80"><span class="item-label">test 2019
        </span></li><li class="select2-results__option l1 " id="select2-company-result-79pj-97" role="treeitem" aria-selected="false" data-val="97"><span class="item-label">Test co a1
        </span></li><li class="select2-results__option l1 " id="select2-company-result-6j6i-5" role="treeitem" aria-selected="false" data-val="5"><span class="item-label">Test Company (R1)
        </span></li><li class="select2-results__option l1 non-leaf opened showme" id="select2-company-result-cfqy-94" role="treeitem" aria-selected="false" data-val="94"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">XYZ 1
        </span></li><li class="select2-results__option l2 showme" id="select2-company-result-wpsg-95" role="treeitem" aria-selected="false" data-val="95" data-pup="94"><span class="item-label">XYZ 1-1-1
        </span></li><li class="select2-results__option l1 non-leaf opened showme" id="select2-company-result-cx7u-92" role="treeitem" aria-selected="false" data-val="92"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">XYZ Test 2
        </span></li><li class="select2-results__option l2 showme" id="select2-company-result-2rso-93" role="treeitem" aria-selected="false" data-val="93" data-pup="92"><span class="item-label">XYZ Test 1-1
        </span></li><li class="select2-results__option l1 non-leaf opened showme" id="select2-company-result-ca5f-57" role="treeitem" aria-selected="false" data-val="57"><span class="expand-collapse" onmouseup="expColMouseupHandler(event);"></span><span class="item-label">Yum Brands
        </span></li><li class="select2-results__option l2 showme" id="select2-company-result-owvf-56" role="treeitem" aria-selected="false" data-val="56" data-pup="57"><span class="item-label">In N Out
        </span></li><li class="select2-results__option l1 " id="select2-company-result-uq8f-6" role="treeitem" aria-selected="false" data-val="6"><span class="item-label">Z.Abdul (Customer)
        </span></li></ul></span></span></span>

回答1:


Use WebDriverWait to wait element to be clickable before click:

import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

//...

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".select2-results__option.l1.non-leaf.opened"))).click();

Code below wait visibility of all elements with .select2-results__option.l1.non-leaf.opened. Then filter visible ones by expected value "Einstein" and click.

String value = "Einstein";
driver.findElement(By.className("select2-search__field")).sendKeys(value, Keys.ENTER);

List<WebElement> options = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".select2-results__option")))
        .stream().filter(element -> element.getText().equals(value)).collect(Collectors.toList());

Assert.assertNotEquals(options.size(), 0, String.format("option with %s text", value));
options.get(0).click();


来源:https://stackoverflow.com/questions/58488870/how-to-select-a-dynamic-value-in-select2-dropdown-for-selenium

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!