Selenium - ожидание элемента OutOfBound C# - PullRequest
0 голосов
/ 28 февраля 2020

Я использую привязку Selenium C# и хочу нажать на кнопку addToCart.

Сначала я жду, когда на странице появится кнопка ExpectedConditions.ToBeClickable.

Затем Мне нужно прокрутить страницу вниз, чтобы можно было нажать на кнопку. Я использовал класс Selenium.Interactions, но он также работает с js executor.

private By addToCartBy = By.XPath("/html/body/div[2]/div/div/div[1]/div/div[3]/div[2]/div/section[1]/div[2]/aside/div/div[2]/div/div[2]/div/button");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
IWebElement addToCart = wait.Until(ExpectedConditions.ElementToBeClickable(addToCartBy));
Actions action = new Actions(driver);
action.MoveToElement(addToCart);
action.Perform();
addToCart.Click();

Когда я выполняю этот тест с драйвером Chrome, страница загружается и навигатор прокручивается вниз до элемента addToCart и нажмите его, но я не могу заставить кнопку работать должным образом.

Когда я использую драйвер Firefox, возникает это исключение: OpenQA.Selenium.WebDriverException : '(1435, 998) is out of bounds of viewport width (1920) and height (966)', и я не могу нажать на кнопку

В большинстве случаев щелчок будет выполняться, но нет действие будет следовать из этого. Если я хочу, чтобы кнопка работала правильно (go в корзине), мне нужно поставить System.Threading.Thread.Sleep(2000), чтобы она работала, или Console.ReadLine(). Даже если я отключаю щелчок автоматизации и делаю это вручную, кнопка не всегда срабатывает.

Как я могу убедиться, что мой элемент addToCart отображается после того, как я перешел в Element? таким образом, чтобы щелкнуть по нему, когда он будет готов.

Спасибо, Элке Джонсон

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Для некоторых сценариев ios вы можете использовать не

IWebElement.Click ();

, но

IWebElement.SendKeys (Keys.Enter);

У меня был какой-то сценарий ios, где только Click () не работал для меня. Возможно, это поможет вам ситуация.

0 голосов
/ 29 февраля 2020

Вам необходимо учесть несколько моментов.

  • Чтобы вызвать MoveToElement(), Ожидаемые условия , поскольку ElementToBeClickable() является излишним. Вместо этого вы можете покончить с ElementIsVisible().
  • При вызове Click() в соответствии с лучшими практиками вам нужно вызвать WebDriverWait в несвязке с ExpectedConditions как ElementToBeClickable().
  • Таким образом, ваш блок кода будет:

    Actions action = new Actions(driver);
    action.MoveToElement(new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible(By.XPath("/html/body/div[2]/div/div/div[1]/div/div[3]/div[2]/div/section[1]/div[2]/aside/div/div[2]/div/div[2]/div/button")))).Perform();
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("/html/body/div[2]/div/div/div[1]/div/div[3]/div[2]/div/section[1]/div[2]/aside/div/div[2]/div/div[2]/div/button"))).Click();
    
...