Selenium WebDriver IEDriverServer点击链接Javascript doPostBack

时间:2017-01-20 20:44:30

标签: javascript selenium webdriver dopostback selenium-iedriver

我正在测试一个ASP.NET应用程序,该应用程序有很多链接在其href中调用Javascript doPostBack,如下所示:

href="javascript:__doPostBack('ctl04$ctl06$Entities','Impersonate$12345')"

Selenium WebDriver element.Click()方法仅适用于Firefox。对于IEDriverServer,单击链接后没有任何反应。

我开始使用Googling,看起来Javascript操作实际上并没有使用Click()方法调用,我可以找到的唯一建议就是像这样使用IJavaScriptExecutor(这样可行):

var js = Globals.Driver as IJavaScriptExecutor;
js?.ExecuteScript($"javascript:__doPostBack('ctl04$ctl06$Entities','Impersonate$12345')");

这在Windows 7和Windows 8.1上的IE11上都会发生。我还没有尝试过Windows 10。

是否还有其他解决方案,因为我有很多这样的链接来修改代码:( :( :(

============================================ ============================ 更新于01/22/17,其中包含更多屏幕截图和详细信息。我目前无法访问实际的应用程序代码,但如果这还不够,我可以请求访问。

这是我尝试点击的链接的HTML代码: enter image description here

这是我的测试代码,找到点击链接(没什么特别的):

enter image description here

当我通过这段代码进行调试时,我可以看到链接被找到并成功点击(没有例外)。屏幕还有一条围绕所述链接的虚线。此代码适用于Firefox,因此元素本身没有任何问题。但是,在Firefox中,在Click()操作之后,屏幕将按预期重新加载。在IE11中,除了虚线外没有任何事情发生。

enter image description here enter image description here

我为IE添加了以下代码,在调用此ExcecuteScript方法之后,页面将加载预期结果。

enter image description here

对于它的价值,这是在点击该链接后应该加载的结果页面。 enter image description here

1 个答案:

答案 0 :(得分:1)

我尝试使用一个小的ASP.NET示例,它似乎也适用于Selenium和IE。你能更具体地了解你的pgae是什么样的吗?

这是我尝试的内容:

WebForm1.aspx的

<div>
  <asp:LinkButton runat="server" OnClick="Unnamed_Click" ID="one">test link button</asp:LinkButton>
  <asp:Label runat="server" ID="label"></asp:Label>
</div>

WebForm1.aspx.cs中

protected void Unnamed_Click(object sender, EventArgs e) {
  label.Text += "Clicked";
}

以下是生成的HTML的样子:

<a id="one" href="javascript:__doPostBack('one','')">test link button</a>

以下是测试:

driver.get("http://localhost:41058/WebForm1.aspx");

new WebDriverWait(driver, 1).until(ExpectedConditions.elementToBeClickable(By.id("one"))).click();
new WebDriverWait(driver, 1).until(ExpectedConditions.elementToBeClickable(By.id("one"))).click();
new WebDriverWait(driver, 1).until(ExpectedConditions.elementToBeClickable(By.id("one"))).click();

使用ChromeDriver和InternetExplorerDriver(在Windows 10上使用IE11)可以正常工作。

但是有一些陷阱:

__doPostBack调用实际上会在浏览器中重新加载页面,因此您无法使用之前可能已缓存的WebElement引用。换句话说,这不会起作用:

WebElement element = driver.findElement(By.id("one"));

element.click();
element.click();

因为第二个element.click()会产生StaleElementException。