java - 如何在 selenium 的 select2 下拉列表中选择动态值

标签 java selenium-webdriver selenium-chromedriver

我正在编写一个测试,其中需要从 select2 下拉列表中选择数据。 Ajax 调用正在获取可以根据场景更改的数据。

如果我输入硬编码值,我的解决方案有效,但该解决方案对我来说不可行

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);

我尝试了以下代码和其他一些代码,但无法运行

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>

最佳答案

使用WebDriverWait在点击之前等待元素可点击:

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();

下面的代码使用 .select2-results__option.l1.non-leaf.opened 等待所有元素的可见性。然后按预期值“爱因斯坦”过滤可见的并单击。

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();

关于java - 如何在 selenium 的 select2 下拉列表中选择动态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58488870/

相关文章:

javascript - 将 IJavaScriptExecutor 执行脚本结果分配给局部变量

selenium - 如何使用 selenium 和 Ruby for Mac OSx 在后台运行 chrome 驱动程序?

java - 检查 JDBC String/VARCHAR 比较中的转义 %?

java - 如何从字符串中获取一个字符

c# - 如何使用 Selenium ExecuteScript 函数获取 HashTable

python - selenium find_element_by_css_selector 用于长类名

vba - 禁用图像 - Selenium VBA Chromedriver

java - 查找数组中的周围数字(java)

java - Android studio Webview 弹出窗口内

java - 如何检索 selenium webdriver 中的动态值