从<ul> <li> .. </li> <ul>标记的下拉列表中选择元素,其中<ul>标记具有属性样式-display:none

时间:2019-10-03 11:03:24

标签: c# html selenium internet-explorer selenium-webdriver

我想单击div [@ id ='main_filter'],然后从下拉列表中选择一个li元素。

但是我面临的问题是,父标记具有属性 style = display:无,因此li项被隐藏。所以我无法从li标签中获取元素。

我正在创建一个通用方法来选择下拉菜单。

<div id="main_filter" class="drop-select-wrap">
<span data-title="Active Clinic Patients" data-value="101" class="optionValue ov-gradient">Active Clinic Patients&nbsp;&nbsp;▼</span>

    <ul class="dropSelect" id="parentFilter" style="display: none; width: 175px;">
        <li id="filterTypes" data-value="102" onclick="tier1FilterChanged(this);" data-rel="My Active Patients">
        <span data-title="My Active Patients">My Active Patients</span>
        </li>
        <li id="filterTypes" data-value="101" onclick="tier1FilterChanged(this);" data-rel="Active Clinic Patients">
        span data-title="Active Clinic Patients">Active Clinic Patients</span>
        </li>
        <li id="filterTypes" data-value="126" onclick="tier1FilterChanged(this);" data-rel="Inactive Patients">
        <span data-title="Inactive Patients">Inactive Patients</span>
        </li>
    </ul>
</div>

我的解决方案: 私有IWebElement parentFilter => driver.FindElement(By.XPath(“ // div [@ id ='main_filter'] [1] / span”));

public void SelectFilter(string filterOption)

{

   ElementHandler.Click(parentFilter);
   IWebElement element = driver.FindElement(By.Id("parentFilter"));
        ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].removeAttribute('style')", element);
 IWebElement filterName = element.FindElement(By.XPath("//li/span[contains(text(),'" + filterOption + "')]"));
                    //driver.FindElement(By.XPath("/ul[@id='parentFilter']/li/span[contains(text(),'"+ filterOption + "')]"));

ElementHandler.SelectFromDropdown(parentFilter, filterName);

}

public static void SelectFromDropdown(IWebElement element1,IWebElement element2)

{

  Actions action = new Actions(driver);
  action.ClickAndHold(element1).Build().Perform();
            action.ClickAndHold(element1).MoveToElement(element2).Click().Build().Perform();

}

2 个答案:

答案 0 :(得分:0)

您可以尝试在隐藏的ul元素上执行一些Javascript来更改其style属性并显示它。我看到您已经在尝试删除样式属性,但是让我向您展示一种在此之前起作用的方法:

IWebElement elementToShow = driver.FindElement(By.XPath("//ul[@class='dropSelect']"));
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].style.display = 'block';", elementToShow);

如果这行得通,那么您应该可以点击li元素。

答案 1 :(得分:0)

Selenium的核心功能之一是,当Webdriver尝试与被遮盖或隐藏的元素进行交互时,它将不会这样做。这是一件好事,因为它使我们能够在测试环境中检测到此类异常,而不是向用户公开此类行为。

不过,这有时可能会造成混淆。例如,尝试单击被透明覆盖的a的Webdriver将不会这样做,因为它被覆盖了,尽管它在人眼中看起来像是可单击的元素。