我在Selenium WebDriver for C#中自动测试我们的webapp。我们的一个测试场景发现了多次单击“保存”按钮导致多个相同记录的问题。
标准IWebElement.Click()
导致Selenium阻止,直到页面完全加载。这意味着当我们第二次点击执行时,回复已经执行,我们不再在表单页面上了。
有没有人知道手动'点击一个不会导致Selenium阻止的元素?
答案 0 :(得分:1)
您可以等待预定的时间来加载页面:
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
...或者更加动态,等待按钮出现:
var driver = new WebDriver();
var wait = new WebDriverWait(driver, TimeSpan(0, 1, 0));
wait.Until(d => d.FindElement(By.Id("button"));
来源:https://stackoverflow.com/a/7811812/2006048
Selenium的源代码与第二种方法类似:http://selenium.googlecode.com/svn/trunk/dotnet/src/WebDriver.Support/UI/ExpectedConditions.cs
让我知道它是否适合你。我个人在WatiN使用这些选项:
browser.WaitForComplete();
...或:
browser.WaitUntilContainsText("Text");
耻辱Selenium没有第一个。
答案 1 :(得分:0)
您需要做的是点击通过javascript。在java中,这样做:
IJavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", driver.findElement(By.id("gbqfd")));
executor.executeScript("arguments[0].click();", driver.findElement(By.id("gbqfd")));
我实际上想象它非常相似,这不会阻止硒,你应该能够在页面回来之前连接一些。
如果这种新方法太慢,你可能会更快地在js中完成所有操作,例如
IJavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById(id).click();");
executor.executeScript("document.getElementById(id).click();");
答案 2 :(得分:0)
如果我们使用JavaScript发送点击事件,则不会阻止Selenium,我们可以多次点击。但是,因为我们的点击会触发页面加载,所以我们无法直接引用该元素。相反,我们需要指定要点击的位置,然后触发点击事件。
因为我们的WebApp使用JQuery,所以我能够使用此处指定的代码: How to simulate a click by using x,y coordinates in JavaScript?
所以最后我们的C#逻辑看起来像这样:
IWebElement element = driver.findElement(By.id("foobar"));
Point point = element.Location;
IJavascriptExecutor jscript = (IJavascriptExecutor)driver;
jscript.executeScript("$(document.elementFromPoint(arguments[0], arguments[0])).click();", point.X, point.Y);
虽然这会发送click事件,但我并不是100%确定该元素是否接收到它;我会做一些实验并看看。