我在通过Selenium设置Select对象时遇到问题。此Select对象有一些与之关联的JavaScript,在加载页面时会填充它的“选项”。我相信这会导致它表现不同。通常我可以使用以下内容设置Select对象:
SelectElement sel = new SelectElement(ele);
sel.SelectByText(value);
使用此特定对象,相同的代码将成功执行(不抛出任何异常),但是不会设置该值。请注意,我将睡眠和重新调试放入其中,我确信在执行代码之前,Select对象已完全加载(否则会发生异常)。
给我这个麻烦的两个Select对象也显得与标准html选择对象不同,这加强了我认为它们不是标准选择的信念。这张图片的前两个下降是麻烦的,而其余的按预期工作:
不幸的是,这是一个我无法让您访问的私人页面,但希望此HTML代码段足够了:
<h3>Details of your primary qualification, examination, or assessment</h3>
<script type="text/javascript" src="/assets/js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="/assets/js/jquery.ui.position.js"></script>
<script type="text/javascript" src="/assets/js/jquery.ui.selectmenu.js"></script>
<script type="text/javascript">
j$(document).ready(function () {
j$(".field [id$='_drpInstitution']").selectmenu();
j$(".field [id$='_drpName']").selectmenu();
j$(".field [id$='_drpInstitution']").change(function () {
__doPostBack('content_0$ucCourse$drpInstitution', '');
});
j$(".field [id$='_drpName']").change(function () {
__doPostBack('content_0$ucCourse$drpName', '');
});
});
</script>
<div class="field">
<label for="content_0_ucCourse_drpInstitution" id="content_0_ucCourse_lblInstitution">Name of Australian institution (university/college/examining body):<em class="required">*</em></label>
<select name="content_0$ucCourse$drpInstitution" id="content_0_ucCourse_drpInstitution" class="field-l Institution">
<option value="-1">- Select -</option>
<option selected="selected" value="Australian Catholic University">Australian Catholic University</option>
<option value="Avondale College of Higher Education">Avondale College of Higher Education</option>
<option value="Central Queensland University">Central Queensland University</option>
<option value="Charles Darwin University">Charles Darwin University</option>
<option value="Other">- Other -</option>
</select>
<em class="hint">If your institution does not appear in the list, please select 'Other' and enter your institution in the text box that appears.</em>
<span id="content_0_ucCourse_vldInstitution" style="display:none;"></span>
</div>
当我检查下拉框时,我得到以下跨度而不是获取Select对象:
<span>
<a class="ui-selectmenu ui-widget ui-state-default ui-selectmenu-dropdown ui-state-active ui-corner-top" id="content_0_ucCourse_drpInstitution-button" role="button" href="#nogo" tabindex="0" aria-haspopup="true" aria-owns="content_0_ucCourse_drpInstitution-menu" style="width: 460px;" aria-disabled="false">
<span class="ui-selectmenu-status">Australian Catholic University</span>
<span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s"></span>
</a>
</span>
当我检查生成的下拉列表时,我在页脚中找到了一个UL:
<div class="ui-selectmenu-menu" style="z-index: 2; top: 786px; left: 741px;">
<ul class="ui-widget ui-widget-content ui-selectmenu-menu-dropdown ui-corner-bottom" aria-hidden="true" role="listbox" aria-labelledby="content_0_ucCourse_drpInstitution-button" id="content_0_ucCourse_drpInstitution-menu" style="width: 460px; height: 189px;" aria-disabled="false" tabindex="0" aria-activedescendant="ui-selectmenu-item-562">
<li role="presentation" class=""><a href="#nogo" tabindex="-1" role="option" aria-selected="false">- Select -</a></li>
<li role="presentation" class="ui-selectmenu-item-selected"><a href="#nogo" tabindex="-1" role="option" aria-selected="true" id="ui-selectmenu-item-562">Australian Catholic University</a></li>
<li role="presentation" class=""><a href="#nogo" tabindex="-1" role="option" aria-selected="false">Avondale College of Higher Education</a></li>
<li role="presentation"><a href="#nogo" tabindex="-1" role="option" aria-selected="false">University of Wollongong</a></li>
<li role="presentation"><a href="#nogo" tabindex="-1" role="option" aria-selected="false">Victoria University</a></li>
<li role="presentation" class="ui-corner-bottom"><a href="#nogo" tabindex="-1" role="option" aria-selected="false">- Other -</a></li>
</ul>
</div>
这些都不会出现在Page Source中,所以它都是动态生成的。我目前正在解决选择问题,方法是单击超链接对象id=content_0_ucCourse_drpInstitution-button
,然后单击超链接对象text=Australian Catholic University
任何更好的解决方法都将受到赞赏。
答案 0 :(得分:1)
正如您已经发现的那样,在这种情况下,select->option
并未表示下拉列表。
按原样处理 - 按a
找到Id
元素(这将是您的“选择”),点击它以打开下拉菜单;然后,通过链接文本找到带有“澳大利亚天主教大学”文本的a
元素(这将是您的“选项”):
IWebElement select = driver.FindElement(By.Id("content_0_ucCourse_drpInstitution-button"));
select.Click();
IWebElement option = select.FindElement(By.LinkText("Australian Catholic University"));
option.Click();
我们也可以不同地思考问题 - 如果他们隐藏了我们的select
元素 - 我们只会make it visible。不能保证它会起作用,因为我无法重现问题:
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = false; arguments[0].style.visibility='visible';", element);
其中element
指向您的select
代码。
然后,在使元素可见后尝试使用SelectByText()
:
element.SelectByText("Australian Catholic University");