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, а в вашем случае оно всегда там.
Вам нужно сделать ваше ожидание более умным, например, "подождать, пока не появится" или, возможно, даже "подождать, пока не появится и не появится", так как вам также нужно дождаться окончания анимации.