Как исправить «Элемент в настоящее время не виден» элемент Selenium

#c# #selenium

#c# #селен

Вопрос:

Я пытаюсь щелкнуть по <a> элементу внутри a <div> . Вот html:

 <div class="cart__checkout cart__checkout--small">
   <a class="button button--lg button--info button--checkout" title = "Checkout" href = "https://shop.adidas.ae/en/checkout/onepage/">
      <span> Checkout </span>
      <i class="icon-sprite icon-sprite-arrow-white-right-type-4"></i>
   </a>
</div>
<button id="update_cart_action" class = "button btn-update" style = "display: none;" type = "submit" name = "update_cart_action" value = "update_qty" title = "Update Shopping Cart"></button>
 

Если вы хотите просмотреть исходный сайт, его https://shop.adidas.ae/en/checkout/cart / (вам нужно будет добавить что-то в свою корзину, чтобы увидеть то, что я вижу)

Я пробовал три разных способа:

Первый способ, я нацеливаюсь div на:

 var checkoutButton = driver.FindElement(By.ClassName("cart__checkout cart__checkout--small"));
 

(затем щелчок)

На что я получаю сообщение об ошибке:

Необработанное исключение типа ‘openQA.Selenium.В WebDriver произошло исключение InvalidSelectorException.Дополнительная информация о dll: Данный селектор cart__checkout cart__checkout—small либо недействителен, либо не приводит к созданию WebElement. Произошла следующая ошибка: InvalidSelectorError: составные имена классов не разрешены

Для борьбы с ошибкой составных имен классов я попробовал код:

 var checkoutButton = driver.FindElement(By.CssSelector("div[class*= 'cart__checkout cart__checkout--small']"));
 

с которым ничего не происходит, и я предполагаю, что он был нажат, но не была нажата фактическая ссылка (2-й вариант).

Я думаю, что это может быть правильным способом щелкнуть фактический элемент, за исключением того, что div на самом деле намного больше, чем ссылка. Я предполагаю, что selenium щелкает в центре div, но, как вы можете видеть на скриншоте ниже, в центре div нет ссылки. Есть ли какой-нибудь способ компенсировать мою Click() функцию?

Или я попытался настроить таргетинг a с помощью:

 var checkoutButton = driver.FindElement(By.CssSelector("a[class*='button button--lg button--info button--checkout']"));
 

Это просто выдает ошибку, что ее нет в текущем представлении, скорее всего, потому a , что находится под div

ошибка:

Необработанное исключение типа ‘openQA.Selenium.В WebDriver произошло исключение ElementNotVisibleException.Дополнительная информация о dll: элемент в настоящее время не виден и поэтому не может взаимодействовать с

Спасибо за помощь. Я думаю, что мой второй вариант — лучший выбор. Есть ли какой-нибудь способ компенсировать a Click() ? Спасибо.

Ответ №1:

Ваш селектор CSS был немного отключен. Обратите внимание на «.» между двумя классами. Кроме того, вы можете настроить таргетинг на a конкретно. Попробуйте это:

 var checkoutButton = driver.FindElement(By.CssSelector("div.cart__checkout.cart__checkout--small a"));
 

Комментарии:

1. Очень полезная стратегия. Буду использовать это в последующих задачах, спасибо!

Ответ №2:

Может быть, вы можете использовать:

 ILocatable hoverItem = (ILocatable)driver.FindElement(By.XPath("//*[@id='js-minicart']"));
IMouse mouse = ((IHasInputDevices)driver).Mouse;
mouse.MouseMove(hoverItem.Coordinates);
 

После проверки <a> элемента:

 driver.FindElement(By.Xpath('//*[@id="js-minicart"]/li/div[2]/div[3]/div[4]/ul/li/a/span'));
 

Ответ №3:

Вы должны попробовать использовать WebDriverWait , чтобы дождаться, пока элемент не станет видимым, и включить щелчок, ExpectedConditions.ElementToBeClickable прежде чем взаимодействовать, как показано ниже :-

 var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement checkOut = wait.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("a.button--checkout[title ='Checkout']")));
checkOut.Click();
 

Ответ №4:

Я смог получить эту кнопку и нажать на нее со следующим XPATH:

 //*[@id = 'cart-form']//a[@title = 'Checkout']
 

Итак, в C # вы бы сделали это:

 var checkoutButton = driver.FindElement(By.XPath("//*[@id = 'cart-form']//a[@title = 'Checkout']"))
 

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