0

我在 C# 中使用 Selenium WebDriver。我有一个 RadMenu,我想在其中悬停,一旦我这样做;它应该展开一个子菜单,其中包含我要单击的特定 web 元素。我必须使用 JavaScript 来单击元素,但这似乎并没有扩展菜单,是否有任何 java 脚本命令可以用来执行此操作。例如:

                IJavaScriptExecutor js = ts.getDriver() as IJavaScriptExecutor;
                js.ExecuteScript("arguments[0].style.display='block'",leftPane_Customer);
                js.ExecuteScript("arguments[0].click()", leftPane_Customer);
                js.ExecuteScript("arguments[0].scrollIntoView(true);",leftPane_Customer);

.click() 似乎突出显示了第一个菜单,但这是我所能得到的。任何人都可以提供扩展子菜单的解决方案(包括javascript语法)吗?

谢谢

4

1 回答 1

0

您可以使用以下方法模拟悬停事件

public static void HoverOn(this RemoteWebDriver driver, IWebElement elementToHover)
{
    var action  = new Actions(driver);
    action.MoveToElement(elementToHover).Perform();
}

然而,动态切换元素上的点击事件可能会导致很多麻烦。为了获得非常稳定的点击事件模拟,我使用以下代码

public static void ClickOn(this RemoteWebDriver driver, IWebElement expectedElement)
{
    try
    {
        expectedElement.Click();
    }
    catch (InvalidOperationException)
    {
        if (expectedElement.Location.Y > driver.GetWindowHeight())
        {
            driver.ScrollTo(expectedElement.Location.Y + expectedElement.Size.Height);
            Thread.Sleep(500);
        }
        driver.WaitUntil(SearchElementDefaultTimeout, (d) => driver.IsElementClickable(expectedElement));
        expectedElement.Click();
    }
}
private static bool IsElementClickable(this RemoteWebDriver driver, IWebElement element)
{
    return (bool)driver.ExecuteScript(@"
            window.__selenium__isElementClickable = window.__selenium__isElementClickable || function(element)
            {
                var rec = element.getBoundingClientRect();
                var elementAtPosition = document.elementFromPoint(rec.left, rec.top);
                return element == elementAtPosition;
            };
            return window.__selenium__isElementClickable(arguments[0]);
    ", element);
}

此代码是可维护 Selenium 项目的一部分。您可以查看项目站点以获取有关使用 Selenium 创建可维护 UI 测试的更多信息https://github.com/cezarypiatek/MaintainableSelenium/

于 2017-01-06T20:02:54.443 回答