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()
时,您需要将 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();
我使用 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()
时,您需要将 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();