Невозможно сделать явное ожидание с WebDriverWait в C # для меню гамбургера - PullRequest
0 голосов
/ 22 октября 2018

В последнее время я возился с селеном в c #.Я наткнулся на проблему, которую в настоящее время не могу решить.По сути, я пытаюсь открыть «меню» для гамбургеров в верхнем левом углу веб-сайта и навести курсор на его первый пункт меню: «Loterie», который должен вызвать другое подменю, чтобы всплыть прямо рядом с меню гамбургеров с некоторыми »подопции "до" Loterie ".

Сценарий будет выглядеть так: Меню -> Лотерея -> Пользователь может увидеть следующие параметры: Sportka / Eurojackpot / Rychle Kacky / etc ....

Сначала я использовал 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 # не работают.Что не так?
Команда неявного ожидания не работает - селеновый веб-драйвер 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»).Однако в некоторых других случаях меню гамбургера только опускается, и мышь не перемещает в «Loterie», поэтому пользователь остается только с открытым меню гамбургера, а «подменю» не появляетсясрабатывает.

1 Ответ

0 голосов
/ 22 октября 2018

Чтобы вызвать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...