硒-等待OutOfBound元素C#

时间:2020-02-28 19:19:12

标签: c# selenium action indexoutofboundsexception webdriverwait

我使用Selenium C#绑定,我想单击addToCart按钮。

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

然后,我需要向下滚动页面才能单击按钮。我使用了Selenium.Interactions类,但它与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()才能生效。即使我禁用了自动单击并手动执行了该按钮,该按钮也不会始终进行。

移动到Element后,如何确保显示元素addToCart? 在他准备好后可以点击它。

谢谢你,埃尔克·约翰逊

2 个答案:

答案 0 :(得分:1)

在某些情况下,您不能使用

IWebElement.Click();

但是

IWebElement.SendKeys(Keys.Enter);

我有一些情况,只是 Click()对我不起作用。也许这对您的情况有所帮助。

答案 1 :(得分:0)

您需要考虑几件事。

  • MoveToElement()的身份来调用ElementToBeClickable()ExpectedConditions是过分的。相反,您可以取消使用ElementIsVisible()
  • 在按照最佳做法调用Click()时,您需要将WebDriverWait ExpectedConditions 作为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();