#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 для вас, если вы хотите лучше его понять.