【问题标题】:Selenium Webdriver: Selecting menu item in multi-level menuSelenium Webdriver:在多级菜单中选择菜单项
【发布时间】:2015-05-27 12:10:25
【问题描述】:

Visual Studio 中的 Selenium WebDriver 与 C#。 我创建了一个驱动程序对象,我正在使用它的一个实例。

我正在尝试访问此站点的顶部菜单:http://store.demoqa.com/

第二个菜单元素“产品类别”有一个子菜单。我正在尝试模拟“产品类别”元素的鼠标悬停,然后选择并单击列表中的第一个元素(附件)。

这是我到目前为止所得到的,由这里和其他地方的几次搜索拼凑而成。它可以点击菜单项(“附件”)。我看到顶部元素被选中,并且菜单项被“选中”,因为当鼠标悬停在它上面时它会略微缩进。但是,从那里我似乎无法 Click() 它。

“menu-item-33”是顶部菜单项,产品类别。 “menu-item-34”是子菜单项 Accessories。

Actions action = new Actions(FFDriver.Instance);
IWebElement we = FFDriver.Instance.FindElement(By.Id("menu-item-33"));
action.MoveToElement(we).MoveToElement(FFDriver.Instance.FindElement(By.Id("menu-item-34"))).Click().Build().Perform(); 

它移动到正确的项目,但 Click() 函数似乎不起作用,因为页面没有改变。

如果信息太少,请原谅我,但我已尝试将其范围缩小到似乎难以解决的代码。

【问题讨论】:

    标签: c# visual-studio selenium-webdriver


    【解决方案1】:

    我不明白为什么您的代码不起作用。但是,如有必要,您可以尝试实施一些显式等待。我已经尝试了以下方法并且它有效。注意:我总是建议你使用id 来定位元素。但是,我想我会向您展示另一种选择,直接找到锚对于子菜单项会更明智

    By byId = By.Id("menu-item-33");
    By css = By.CssSelector("a[href*='product-category/accessories']");
    
    Actions action = new Actions(_driver);
    IWebElement we = _driver.FindElement(byId);
    action.MoveToElement(we).Build().Perform();
    new WebDriverWait(_driver,TimeSpan.FromSeconds(2)).Until(ExpectedConditions.ElementIsVisible(css)).Click();
    

    【讨论】:

    • 哇,成功了。我想过尝试以与 ID 不同的方式查找元素,但我不明白为什么会有所作为。那么为什么这个行得通,而另一个不行呢?
    • 如果我使用您的代码并将 By.CssSelector 替换为 By.Id("menu-item-34"),它不起作用。它甚至似乎找不到菜单项。但这可能是因为 Id 查找与 CssSelector 查找不同?
    • 好吧,使用By.Id("menu-item-34") 你会发现li 不是锚。 Anchor(a tag) 更精确。您也可以使用 By css = By.CssSelector("a[href*='product-category/accessories']"); 尝试您的代码,这应该也可以。
    • 而且,我确实有一些明确的等待,以确保元素已准备好进行某些交互,而您却没有
    • 没错,关于等待。但是,我没有在我的代码中添加它们,因为我尝试添加它们并没有帮助。但我同意在使用这样的元素时等待是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2014-02-26
    • 2012-07-10
    相关资源
    最近更新 更多