如何修复&#34;元素目前不可见&#34; Selenium <a> Element

时间:2016-10-14 09:57:37

标签: c# selenium

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()?感谢。

4 个答案:

答案 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。