【问题标题】:Selenium WebDriver IEDriverServer Click Link Javascript doPostBackSelenium WebDriver IEDriverServer 点击链接 Javascript doPostBack
【发布时间】:2017-01-20 20:44:30
【问题描述】:

我正在测试一个 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添加了如下代码,调用了这个ExcecuteScript方法后,页面加载了预期的结果。

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

【问题讨论】:

    标签: javascript selenium webdriver dopostback selenium-iedriver


    【解决方案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。

    【讨论】:

    • 我目前无权访问应用程序代码,因此我将尽力提供我所拥有的所有详细信息。我用更多截图更新了帖子。希望你能抓住一些东西。如果没有,我可以请求访问代码,看看我们还能挖掘什么。提前感谢您的帮助。
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多