首页 > 解决方案 > 无法在 C# 中使用 WebDriverWait 显式等待汉堡菜单

问题描述

我最近一直在用 c# 中的 selenium 搞乱。我偶然发现了一个我目前无法解决的问题。基本上,我试图在网站的左上角打开一个汉堡“菜单”并将鼠标悬停在其第一个菜单项上:“Loterie”,这应该会触发另一个子菜单在汉堡菜单旁边弹出一些“子选项”到“彩票”。

场景将是:菜单 -> Loterie -> 用户能够看到这些选项:Sportka / Eurojackpot / Rychle Kacky / 等等......

首先,我使用 Thread.Sleep 来完成我的任务并且它工作正常,如下所示:

        m_driver = new ChromeDriver("C:/Users/richard/source/repos/ConsoleApp43");
        m_driver.Url = "https://www.sazka.cz/";
        m_driver.Manage().Window.Maximize();
        IWebElement subMenu = m_driver.FindElement(By.Id("header-menu")); subMenu.Click();
        IWebElement element = m_driver.FindElement(By.XPath("//*[@id='menuElem']/li[1]/a"));
        Actions action = new Actions(m_driver);
        System.Threading.Thread.Sleep(1000);
        action.MoveToElement(element).Perform();  

但是,有人提到这是一种不好的做法,应该改用 WebDriverWait 类。所以我尝试使用 WebDriverWait 类,但我无法让它运行。

我找到了几个应该解决我的问题的解决方案,但它们似乎都没有工作,例如
Selenium C# 中的显式等待不起作用。怎么了?
隐式等待命令不起作用-selenium webdriver C#
如何让 webDriver 等待页面加载(C# Selenium 项目)

我最终得到了这样的东西。但是,我仍然无法运行它,因为使用以下代码,由于某种原因,只有 50% 的测试运行正确执行。

        m_driver = new ChromeDriver("C:/Users/richard/source/repos/ConsoleApp43");
        m_driver.Url = "https://www.sazka.cz/";
        m_driver.Manage().Window.Maximize();     
        IWebElement menu = m_driver.FindElement(By.Id("header-menu")); menu.Click();
        WebDriverWait wait = new WebDriverWait(m_driver, TimeSpan.FromSeconds(1));
        var loterie = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='menuElem']/li[1]/a")));
        Actions action = new Actions(m_driver);
        action.MoveToElement(loterie).Build().Perform();

有人可以帮我吗?

编辑:主要问题是,有时当我运行测试时,代码会正常工作(=汉堡菜单向下滚动,鼠标悬停在“Loterie”上)。但是在其他一些情况下,汉堡菜单只会向下滚动,鼠标不会悬停在“彩票”上,因此用户只剩下打开的汉堡菜单,“子菜单”不会被触发。

标签: c#seleniumtestingautomated-testswebdriverwait

解决方案


要调用url https://www.sazka.cz/,请单击Burger,将鼠标悬停Loterie上,然后单击click()文本为Sportka的元素,您可以使用以下解决方案:

m_driver = new ChromeDriver("C:/Users/richard/source/repos/ConsoleApp43");
m_driver.Url = "https://www.sazka.cz/";
m_driver.Manage().Window.Maximize();     
new WebDriverWait(m_driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//a[@class='show-sidebar' and @id='header-menu']"))).Click();
var loterie = new WebDriverWait(m_driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='menu-box open']//a[contains(@href,'loterie')]")));
new Actions(m_driver).MoveToElement(loterie).Build().Perform();
var sportka = new WebDriverWait(m_driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//div[@class='menu-box open']//a[contains(@href,'loterie')]//following::ul[1]/li/a[contains(.,'Sportka')]")));
new Actions(m_driver).MoveToElement(sportka).Click().Build().Perform();

推荐阅读