C# Selenium选择不处理某些对象
我无法通过Selenium设置选择对象。这个Select对象有一些与之关联的JavaScript,在加载页面时填充它的“选项”。我相信这会导致它的行为有所不同。通常,我可以使用以下设置选择对象:C# Selenium选择不处理某些对象,c#,html,selenium,selenium-webdriver,C#,Html,Selenium,Selenium Webdriver,我无法通过Selenium设置选择对象。这个Select对象有一些与之关联的JavaScript,在加载页面时填充它的“选项”。我相信这会导致它的行为有所不同。通常,我可以使用以下设置选择对象: SelectElement sel = new SelectElement(ele); sel.SelectByText(value); 对于这个特定的对象,相同的代码将成功执行(没有抛出异常),但是没有设置值。请注意,我将sleeps和re-trys放在其中,我确信Select对象在代码执行之前已完
SelectElement sel = new SelectElement(ele);
sel.SelectByText(value);
对于这个特定的对象,相同的代码将成功执行(没有抛出异常),但是没有设置值。请注意,我将sleeps和re-trys放在其中,我确信Select对象在代码执行之前已完全加载(否则会发生异常)
这两个给我带来麻烦的Select对象看起来也不同于标准的html Select对象,这使我更加相信它们不是标准的Select对象。此图中的前两个下拉列表是比较麻烦的,而其余的则按预期工作:
不幸的是,这是一个我无法让您访问的私人页面,但希望这个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>
您的主要资格、考试或评估的详细信息
j$(文档).ready(函数(){
j$(“.field[id$=”\u drpInstitution'])。选择菜单();
j$(“.field[id$=”'u drpName'])。选择菜单();
j$(“.field[id$=”\u drpInstitution']”)。更改(函数(){
__doPostBack(“内容”\u 0$ucCourse$drpInstitution',“”);
});
j$(“.field[id$=”\u drpName']”)。更改(函数(){
__doPostBack('content_0$ucCourse$drpName','');
});
});
澳大利亚机构名称(大学/学院/考试机构):*
-挑选-
澳大利亚天主教大学
阿文代尔高等教育学院
中央昆士兰大学
达尔文大学
-其他-
如果您的机构未出现在列表中,请选择“其他”并在出现的文本框中输入您的机构。
当我检查下拉框时,我得到的不是选择对象,而是以下范围:
<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>
所有这些都不会出现在页面源代码中,因此都是动态生成的。我目前正在解决选择问题,方法是单击超链接对象id=content\u 0\u course\u drpInstitution-button
,然后单击超链接对象text=Australian Catholic University
如果有更好的解决方法,我们将不胜感激。正如您已经发现的,在这种情况下,下拉列表不是由
select->option
表示的
按原样处理-通过Id
查找a
元素(这将是您的“选择”),单击它打开下拉列表;然后,通过链接文本找到带有文本“澳大利亚天主教大学”(这将是您的“选项”)的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
元素,我们就可以。由于我无法重现问题,因此无法保证它会起作用:
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = false; arguments[0].style.visibility='visible';", element);
其中元素
指向您的选择
标记
然后,在使元素可见后,尝试使用SelectByText()
:
在进行选择之前调用
ele.click()
是否有任何区别?如果我尝试单击Select元素,则会出现ElementNotVisibleException!但它仍然允许我使用上面的代码设置Select元素。有一个span对象存在于与Select相同的位置,我可以使用它来单击它,但这感觉更像是一个解决方案,而不是一个解决方案。还有什么想法吗?看起来实际的select+选项
是隐藏的,还有其他元素负责单击和选择选项,通过javascript触发引擎盖下的选择选项更改。我相信你是对的。当我在Chrome调试模式下将鼠标悬停在Select元素上时,页面上没有突出显示任何内容。当这些隐藏的选择对象被使用时,我将不得不进行一次黑客攻击。很好。尝试右键单击下拉列表并选择“Inspect Element”-哪个元素在源代码中突出显示?感谢您的建议和链接。我花了30分钟尝试了JavaScriptExecutor
的各种实现,虽然所有的实现看起来都成功执行了,但我无法让Select对象工作。我又回到了以前单击a
元素的状态。
element.SelectByText("Australian Catholic University");