I am trying to click on an <a>
element inside of a <div>
.
Here is the 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>
If you want to see the original site its https://shop.adidas.ae/en/checkout/cart/ (您必须在购物车中添加一些内容才能看到我看到的内容)
我尝试了三种不同的方式:
第一种方式,我将div
定位为:
var checkoutButton = driver.FindElement(By.ClassName("cart__checkout cart__checkout--small"));
(然后点击)
我收到错误:
未处理的类型&#39; OpenQA.Selenium.InvalidSelectorException&#39;发生在WebDriver.dll中 附加信息:给定的选择器cart__checkout cart__checkout - small无效或不会产生WebElement。发生以下错误: InvalidSelectorError:不允许使用复合类名
为了对抗复合类名称错误,我尝试了代码:
var checkoutButton = driver.FindElement(By.CssSelector("div[class*= 'cart__checkout cart__checkout--small']"));
没有任何反应,我假设它被点击了,但没有点击实际的链接(第二个选项)。
我认为这可能是点击实际元素的有效方法,除了div实际上比链接大得多。我假设selenium正在点击div的中心,但正如你从下面的截图中看到的那样,div的中心没有链接。有没有办法抵消我的Click()
功能?
或者,我尝试将a
定位于:
var checkoutButton = driver.FindElement(By.CssSelector("a[class*='button button--lg button--info button--checkout']"));
这只会给出错误,即它不在当前视图中,很可能是因为a
位于div
错误:
未处理的类型&#39; OpenQA.Selenium.ElementNotVisibleException&#39;发生在WebDriver.dll中 附加信息:元素当前不可见,因此可能无法与
进行交互
感谢您的帮助。我认为我的第二个选择是最好的选择。有没有办法抵消Click()
?感谢。
答案 0 :(得分:1)
你的CSS选择器有点偏。注意“。”两个班级之间。此外,您可以专门针对a。试试这个:
var checkoutButton = driver.FindElement(By.CssSelector("div.cart__checkout.cart__checkout--small a"));
答案 1 :(得分:1)
也许你可以使用:
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'));
答案 2 :(得分:1)
您应该尝试使用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();
答案 3 :(得分:0)
我已经能够获得该按钮并使用以下XPATH单击它:
//*[@id = 'cart-form']//a[@title = 'Checkout']
所以在C#中你会这样做:
var checkoutButton = driver.FindElement(By.XPath("//*[@id = 'cart-form']//a[@title = 'Checkout']"))
如果你想更好地理解它,我可以为你分解XPATH。