我使用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? 在他准备好后可以点击它。
谢谢你,埃尔克·约翰逊
答案 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();