Selenium多次点击链接

时间:2014-08-13 04:55:34

标签: c# selenium selenium-webdriver

我在Selenium WebDriver for C#中自动测试我们的webapp。我们的一个测试场景发现了多次单击“保存”按钮导致多个相同记录的问题。

标准IWebElement.Click()导致Selenium阻止,直到页面完全加载。这意味着当我们第二次点击执行时,回复已经执行,我们不再在表单页面上了。

有没有人知道手动'点击一个不会导致Selenium阻止的元素?

3 个答案:

答案 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%确定该元素是否接收到它;我会做一些实验并看看。