Selenium选择不对某些对象起作用

时间:2015-03-12 02:04:19

标签: c# html selenium selenium-webdriver

我在通过Selenium设置Select对象时遇到问题。此Select对象有一些与之关联的JavaScript,在加载页面时会填充它的“选项”。我相信这会导致它表现不同。通常我可以使用以下内容设置Select对象:

SelectElement sel = new SelectElement(ele);
sel.SelectByText(value);

使用此特定对象,相同的代码将成功执行(不抛出任何异常),但是不会设置该值。请注意,我将睡眠和重新调试放入其中,我确信在执行代码之前,Select对象已完全加载(否则会发生异常)。

给我这个麻烦的两个Select对象也显得与标准html选择对象不同,这加强了我认为它们不是标准选择的信念。这张图片的前两个下降是麻烦的,而其余的按预期工作: enter image description here

不幸的是,这是一个我无法让您访问的私人页面,但希望此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

任何更好的解决方法都将受到赞赏。

1 个答案:

答案 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");