Selenium/C# WebDriverWait не ждет

У меня есть веб-сайт со слайдом jQuery вверху со списком всех языков, которые я хочу использовать: http://testing.bestshippers.com/net/index.aspx, ползунок вверху кнопки "выбор языка".

Я могу щелкнуть по нему, но получаю ошибку при попытке щелкнуть элементы внутри слайда вниз. Я считаю, что это потому, что мне нужно сделать паузу на несколько секунд, прежде чем я попытаюсь выбрать их. Может быть неправильно? Я относительно новичок, но я много читал о WebDriverWait и смене фокуса.

 //check spanish
 driver.FindElement(By.XPath("//*[@id='openCloseWrap']/img")).Click();
 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100));
 driver.FindElement(By.Id("ButtonSPFlag")).Click();

 String check = driver.FindElement(By.XPath("html/body/form/div[5]/div/div[1]/div/p")).Text;
 Console.Out.WriteLine(check);

Приведенный выше код нажимает на openCloseWrap (кнопка выбора языка), а затем я пытаюсь сделать паузу в течение секунд (100), а затем пытаюсь щелкнуть флаг SP, чтобы изменить язык.

Кто-нибудь может оказать любую помощь, почему мое ожидание не будет приостановлено?


person StumpyXXL    schedule 05.05.2014    source источник


Ответы (4)


Вы инициируете Ожидание, но ничего не ждете. Вы, вероятно, хотите сделать что-то похожее на:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100));
//    wait.Until(By.Id("ButtonSPFlag"));
IWebElement element = wait.Until(driver => driver.FindElement(By.Id("ButtonSPFlag")));
element.Click();

В качестве альтернативы вы можете установить неявное ожидание, но я бы выбрал первый.

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
person Erki M.    schedule 06.05.2014
comment
Thread.Sleep() работает, но другие немного испорчены, я думаю, из-за того, как они закодированы на странице. Обновлю, если найду исправление. - person StumpyXXL; 07.05.2014

Я бы проголосовал за вас обоих, но у меня пока недостаточно очков репутации.

Я работал над этим 4 дня, проблема, похоже, связана с тем, как отображается языковая панель. Кажется, я не могу ссылаться на что-либо с помощью CSS, XPath или именования. Я пока продолжу свой проект. Я могу проверить, существует ли он, и это проходит (см. ниже), но фактическое взаимодействие по какой-то причине не выполняется. Я буду продолжать работать, и я буду пересматривать. Спасибо вам обоим за ваше время и усилия!

DoesElementExistX(driver, sw, "//*[@id='openCloseWrap']/img");
DoesElementExistX(driver, sw, "//*[@id='ButtonUSFlag']");
DoesElementExistX(driver, sw, "//*[@id='ButtoFRFlag']");
DoesElementExistX(driver, sw, "//*[@id='ImageButton1']");
DoesElementExistX(driver, sw, "//*[@id='ButtonDEFlag']");
DoesElementExistX(driver, sw, "//*[@id='ButtonITFlag']");
DoesElementExistX(driver, sw, "//*[@id='ButtonSPFlag']");

    #region[DoesElementExistX]
    public static void DoesElementExistX(IWebDriver driver, StreamWriter sw, String id)
    {
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2));
        try
        {
            wait.Until(ExpectedConditions.ElementExists(By.XPath(id)));
        }
        catch (WebDriverTimeoutException)
        {
            sw.WriteLine("FAILED - " + id);
        }
    }
    #endregion
person StumpyXXL    schedule 14.05.2014

Я посмотрел на это еще немного.

Вы пытаетесь щелкнуть элемент Language с помощью id. Это проблема, потому что Selenium будет щелкать в центре элемента (если не указано иное), а центр элемента находится слева от области языка.

Я думаю, что это выполнит то, что вам нужно:

driver.FindElement(By.CssSelector(".topMenuAction")).Click();
driver.FindElement(By.Id("ButtonSPFlag")).Click();
String Check = driver.FindElement(By.CssSelector("#loginBoxInner>p")).Text;

Возможно, вам придется добавить Sleep() или использовать WebDriverWait().

person Richard    schedule 05.05.2014
comment
Хорошо, я понял, что наша частичная проблема (общедоступная статика) отсутствует. - person StumpyXXL; 05.05.2014
comment
Все еще бросает мне ElementNotVisibleException. Когда я смотрю, кажется, что он вообще не ждет. У меня есть: // определить переменную ожидания public static WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(100)); Прямо внутри класса Program: Затем у меня есть: //попытка дождаться, пока элемент не будет существовать var element = wait.Until(d =› driver.FindElement(By.XPath(html/body/form/div[5]/div/div [1]/дел/п))); Проверка строки = элемент.Текст; - person StumpyXXL; 05.05.2014

Может ли быть так, что панель выбора языка всегда находится в DOM, и когда вы нажимаете «развернуть», она просто показывает html, а не создает или вставляет его?

Если это так, то ваше «ожидание» вернется сразу же, потому что вы говорите «подождите, пока элемент» не появится в HTML, а в вашем случае он всегда там.

Вам нужно сделать свое ожидание более разумным, например, «подождать, пока не отобразится» или, возможно, даже «подождать, пока не отобразится и не станет неподвижным», поскольку вам также нужно дождаться завершения анимации.

person Robbie Wareham    schedule 06.05.2014