Невозможно выполнить явное ожидание с помощью WebDriverWait в С# для гамбургер-меню

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

Сценарий будет таким: Меню -> Лотерея -> Пользователь может видеть следующие опции: 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# 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();

Может ли кто-нибудь помочь мне?

РЕДАКТИРОВАТЬ: Основная проблема заключается в том, что иногда, когда я запускаю тест, код работает так, как должен (=меню гамбургера скатывается вниз, а мышь наводится на «Лотерию»). Однако в некоторых других случаях гамбургер-меню только сворачивается, а мышь не наводится на «Лотерию», поэтому пользователю остается только открытое гамбургер-меню, а «подменю» не открывается. получить триггер.


person apploid    schedule 22.10.2018    source источник
comment
Вы получаете какую-либо ошибку, когда это не удается?   -  person Guy    schedule 22.10.2018
comment
Как я узнаю? Я просмотрел журнал VS, и в VS кажется, что все работает нормально. В инструментах Chrome Dev я получаю следующее: Uncaught ReferenceError: SCEChatOptions is not defined at Object.storeEvents   -  person apploid    schedule 22.10.2018
comment
Какие строки вызывают проблему? Является ли проблема тайм-аутом ожидания или щелчком/наведением? Лично я использую driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(seconds); но до тех пор, пока общие методы иногда не работали должным образом, я закончил с task.delay() при использовании асинхронного метода.   -  person apincik    schedule 22.10.2018
comment
Проблема в том, что в некоторых случаях мышь не наводится на лотерею, а меню гамбургера только скатывается вниз (как если бы ожидаемое условие было бы проигнорировано). Я пробовал использовать m_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10), но все равно не работает   -  person apploid    schedule 22.10.2018


Ответы (1)


Чтобы вызвать url https://www.sazka.cz/, нажмите Burger, наведите указатель мыши на Loterie и click() на элемент с текстом. в качестве Спортки можно использовать следующее решение:

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();
person DebanjanB    schedule 22.10.2018
comment
Спасибо, к сожалению, это не работает. Я получаю следующую ошибку в VS: OpenQA.Selenium.WebDriverException: неизвестная ошибка: Элемент не доступен для клика в точке (-110, 95) и не зависает над лотереей. - person apploid; 22.10.2018
comment
Итак, меню гамбургеров теперь выкатывается каждый раз. Мышь также наводилась на лотерею первые два раза, но я пытался выполнить ее еще пару раз, и после первых двух попыток меню гамбургера только скатилось вниз, а мышь не навела на лотерею. - person apploid; 22.10.2018
comment
Я не уверен, где вы застряли, но версии одного и того же кода для Java и Python выполняются на моем конце просто идеально. Вы видите какую-либо ошибку? Обновите вопрос, пожалуйста. - person DebanjanB; 22.10.2018
comment
Я застрял на наведении на Лотерей, так как в некоторых случаях (тестовые прогоны) скатывается только гамбургер-меню, но дальше ничего не происходит. К сожалению, VS не показывает никаких ошибок, и кажется, что тест проходит гладко. - person apploid; 22.10.2018
comment
Добавление ImplicitWait в код DebanjanB отлично работает с моей стороны. Я только что проверил, и он открывает страницу спортка. - person TwinckleTwinckle; 22.10.2018
comment
@TwinckleTwinckle Версия этого блока кода для Java и Python отлично работает с моей стороны. Но мы не должны смешивать ImplicitWait и ExplicitWait, поскольку согласно документация Не смешивайте неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может привести к тайм-ауту через 20 секунд. - person DebanjanB; 22.10.2018
comment
Я с тобой согласен. Я использовал переплет до-диез. Без неявного ожидания это не работает. В любом случае, спасибо за информацию. - person TwinckleTwinckle; 22.10.2018