Selenium - 等待 OutOfBound 元素 C#

Selenium - Wait for OutOfBound element C#

我使用 Selenium C# 绑定,我想点击添加到购物车按钮。

首先,我正在等待按钮出现在带有 ExpectedConditions.ToBeClickable 的页面上。

然后,我需要向下滚动页面才能点击按钮。我使用了 Selenium.Interactions class 但它也适用于 js 执行器。

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)'我无法点击按钮

大多数时候,点击会被执行,但不会有任何动作发生。如果我想让按钮正常工作(去购物车),我需要放置一个 System.Threading.Thread.Sleep(2000)Console.ReadLine() 才能生效。即使我禁用自动点击并手动执行,按钮也不会总是继续。

如何确保我的元素 addToCart 在我移动到元素后显示? 当他准备好时点击它。

谢谢你,埃尔克约翰逊

部分场景可以不使用

IWebElement.Click();

但是

IWebElement.SendKeys(Keys.Enter);

我有一些场景,其中 Click() 对 me.Maybe 不起作用,这将有助于您的情况。

你需要考虑一些事情。

  • MoveToElement()ExpectedConditions 调用为 ElementToBeClickable() 是多余的。相反,您可以取消 ElementIsVisible().
  • 根据最佳实践调用 Click() 时,您需要将 WebDriverWaitExpectedConditions 结合调用为 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();