如何使用 Selenium WebDriver 和 C# 选择在 <span> 标签下定义的下拉菜单项

Posted

技术标签:

【中文标题】如何使用 Selenium WebDriver 和 C# 选择在 <span> 标签下定义的下拉菜单项【英文标题】:How to select dropdown menu item which is defined under <span> tag using Selenium WebDriver and C# 【发布时间】:2019-01-25 20:42:57 【问题描述】:

<div class="span3">
                <div>
                    LSP Account<br>
                    <span title="" class="k-widget k-dropdown k-header" unselectable="on" role="listbox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-owns="cboAccountSettings_listbox" aria-disabled="false" aria-busy="false" aria-activedescendant="7245f0ab-5ba4-4c7b-b722-6c204d700e9f" style="width: 98%;">
                    <span unselectable="on" class="k-dropdown-wrap k-state-default">
                    <span unselectable="on" class="k-input">Any</span>
                    <span unselectable="on" class="k-select">
                    <span unselectable="on" class="k-icon k-i-arrow-s">select</span></span></span>
                    
                    <select id="cboAccountSettings" style="width: 98%; display: none;" data-value-primitive="true" data-bind="value: SWO_Id" data-role="dropdownlist">
                    <option value="" selected="selected">Any</option>
                    <option value="SWO-ARG">SoftwareONE ARG</option>
                    <option value="SWO-AUS">SoftwareONE AUS</option>
                    <option value="SWO-BOL">SoftwareONE BOL</option>
                    <option value="SWO-BRA">SoftwareONE BRA</option>
                    <option value="SWO-CAN">SoftwareONE CAN</option>
                    <option value="SWO-CHL">SoftwareONE CHL</option>
                    <option value="SWO-COL">SoftwareONE COL</option>
                    <option value="SWO-CRI">SoftwareONE CRI</option>
                    <option value="SWO-DOM">SoftwareONE DOM</option>
                    <option value="SWO-ECU">SoftwareONE ECU</option>
                    <option value="SWO-EMEA">SoftwareONE EMEA</option>
                    <option value="SWO-GTM">SoftwareONE GTM</option>
                    <option value="SWO-HKG">SoftwareONE HKG</option>
                    <option value="SWO-HND">SoftwareONE HND</option>
                    <option value="SWO-IDN">SoftwareONE IDN</option>
                    <option value="SWO-JAM">SoftwareONE JAM</option>
                    <option value="SWO-JPN">SoftwareONE JPN</option>
                    
                    </select>
                    </span>
                </div>
            </div>

1) 我可以点击标签使用,但无法选择项目:

driver.FindElement(By.CssSelector("span[aria-owns='cboAccountSettings_listbox']")).Click();

2)我也使用了这段代码,但找不到特定的元素:

var LSPAccount = WebBrowser.FindElement(By.CssSelector("span[aria-owns='cboAccountSettings_listbox']"));   
Thread.Sleep(1000);
var selectElement = new SelectElement(LSPAccount);
Thread.Sleep(1000);
selectElement.SelectByValue("SWO-ARG");

3)我也试过这个,但没有成功:

var xpath = "//span[contains(@class,'k-widget k-dropdown k-header')][contains(@id,'cboAccountSettings')][contains(text(),'SoftwareONE ARG')]";
var admi = WebBrowser.FindElement(By.XPath(xpath));
Thread.Sleep(1000);
admi.Click();

【问题讨论】:

请阅读为什么是screenshot of html or code or error is a bad idea。考虑使用基于格式化文本的相关 HTML、代码试验和错误堆栈跟踪来更新问题。 这个页面有公共链接吗? 【参考方案1】:

您可以尝试以下操作:

//get the select html element
var selectList = driver.FindElement(By.Selector("select#cboAccountSettings"));
//wrap it inside webdriver's SelectElement and select option with value "SWO-ARG"
var selectElement = new SelectElement(selectList);
selectElement.SelectByValue("SWO-ARG");

SelectElement 需要一个代表 html 选择的 IWebElement。另外,请检查目标选择元素是否不在某个框架内。在这种情况下,请先切换到目标框架。

【讨论】:

或者,更简单地说:var selectList = driver.FindElement(By.Id("cboAccountSettings")); 确实!!但是,我更喜欢使用 css 选择器,因为我可以指定元素类型以及 id,以防万一有其他元素具有相同的 id。否则,我将不得不找到所有并使用索引或其他替代方法来到达目标元素! 没有帮助,正如已经提到的 - 【参考方案2】:

选择元素不可见,这是问题所在。您可以使用javascript来选择选项(Java):

String option = "SWO-ARG";
((JavascriptExecutor) driver).executeScript("arguments[0].selected='selected';", driver.findElement(By.cssSelector("#cboAccountSettings option[value='" + option + "']")));

也试试这个:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].removeAttribute('selected');", driver.findElement(By.cssSelector("#cboAccountSettings option[selected]")));
js.executeScript("arguments[0].setAttribute('selected', 'selected');", driver.findElement(By.cssSelector("#cboAccountSettings option[value='SWO-ARG']")));

【讨论】:

感谢您的回答,但似乎 - 我可以通过此代码找到特定元素,但未在下拉列表中选择特定值。在调试时 - 它在变量中给出“空”。 --你能不能复习一下 将 html 分享为文本 在代码中编辑 Htm,希望您的代码能读懂 - 复制粘贴很困难 - 请同时参考屏幕截图,同时使用相同的代码创建环境 请手动选择“SoftwareONE ARG”之类的值,然后打开开发人员工具并搜索“SoftwareONE ARG”,您可能会在 html 中找到具有值的 div 或 ul/li 并共享这些 html 部分。如果可以分享网址,那就容易多了。

以上是关于如何使用 Selenium WebDriver 和 C# 选择在 <span> 标签下定义的下拉菜单项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHP绑定设置Selenium(WebDriver和Server)

如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]

如何使用 Selenium WebDriver 和 Java 处理日历弹出窗口?

如何使用selenium webdriver来判断一个网页加载完毕

如何在 Python 上使用 selenium webdriver 和 browsermob 代理捕获网络流量?

如何使用 Selenium WebDriver 处理登录弹出窗口?