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, чтобы изменить язык.

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

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));

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

Я работал над этим 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

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

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

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

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

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

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

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

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

Другие вопросы по тегам