1

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

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

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

我开始用谷歌搜索,看起来 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。

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

==================================================== ====================== 2017 年 1 月 22 日更新,包含更多屏幕截图和详细信息。我目前无权访问实际的应用程序代码,但如果这还不够,我可以请求访问。

这是我试图点击的链接的 HTML 代码: 在此处输入图像描述

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

在此处输入图像描述

当我通过此代码进行调试时,我可以看到链接已找到并成功单击(无异常)。屏幕上还有一条虚线环绕着所述链接。此代码在 Firefox 中有效,因此元素本身没有任何问题。但是,在 Firefox 中,在 Click() 操作之后,屏幕会按预期重新加载。在 IE11 中,除了那条虚线之外什么都没有发生。

在此处输入图像描述 在此处输入图像描述

我为 IE 添加了以下代码,调用了这个 ExeccuteScript 方法后,页面加载了预期的结果。

在此处输入图像描述

值得一提的是,这是单击该链接后应加载的结果页面。 在此处输入图像描述

4

1 回答 1

2

我用一个小的 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。

于 2017-01-21T16:29:40.453 回答