HTTP 状态:“500”-> 使用 IEDriverServer Selenium 和 Java 单击元素时 'timeout' 的 JSON 状态映射不正确(预期为 408)

HTTP Status: '500' -> incorrect JSON status mapping for 'timeout' (408 expected) while clicking element with IEDriverServer Selenium and Java

以下是与我的流程相关的详细信息 -

问题 - 驱动程序卡住了,要么元素 1 没有被点击,要么在添加足够的等待后元素 1 被点击但现在驱动程序卡在这个流程上,你可以从下面的代码中观察到,一旦 clickurl.click() 被调用,我应该在 10 秒后收到消息“睡眠已完成.. 现在我们return 调用class

但是我得到了异常。

代码-

clickurl = d1.findElement(By.xpath("XPath for Element 1"));

if ( clickurl != null ) {
    System.out.print("****** Clicking on it Directly ");
    clickurl.click(); 

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.print("****** Sleep Completed.. Now we return to calling class ");`

系统详细信息-

其他详情-

错误详情-

Dec 11, 2018 5:02:56 PM org.openqa.selenium.remote.ErrorCodes toStatus
INFO: HTTP Status: '500' -> incorrect JSON status mapping for 'timeout' (408 expected)
Exception in thread "main" org.openqa.selenium.TimeoutException: Timed out waiting for page to load.

这个错误信息...

Dec 11, 2018 5:02:56 PM org.openqa.selenium.remote.ErrorCodes toStatus
INFO: HTTP Status: '500' -> incorrect JSON status mapping for 'timeout' (408 expected)
Exception in thread "main" org.openqa.selenium.TimeoutException: Timed out waiting for page to load.

...暗示 IEDriverServer 无法对元素执行 click()


HTTP 状态:“500”

The HyperText Transfer Protocol (HTTP) 500 Internal Server Error 响应代码表明服务器遇到了阻止它完成请求的意外情况。

此错误响应是通用 "catch-all" 响应。有时,服务器管理员会记录错误响应,如 500 状态代码以及有关请求的更多详细信息,以防止错误在未来再次发生。


HTTP 状态:“408”

408 REQUEST TIMEOUT表示服务器在准备等待的时间内没有收到完整的请求消息。

服务器应该在响应中发送 "close" 连接选项,因为 408 意味着服务器已决定关闭连接而不是继续等待。如果客户端在传输过程中有未完成的请求,客户端可以在新连接上重复该请求。


解决方案

您需要诱导 WebDriverWait 以使所需的 元素可点击 并且您可以使用以下解决方案:

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("XPath for Element 1"))).click();

此外,您还需要注意以下几个方面:

  • 保护模式:在 WindowsVista 或 Windows7 上的 Internet Explorer 7 或更高版本上,您必须设置 保护模式 为每个区域设置相同的值。该值可以打开或关闭,只要每个区域都相同即可。要设置 保护模式设置 ,您必须从 "Tools" 菜单中选择 "Internet Options",然后单击 安全选项卡 .对于每个区域,标签底部都有一个复选框,标签为 启用保护模式

@JimEvans 在他的文章 You're Doing It Wrong: IE Protected Mode and WebDriver 中明确提到:

Using the capability doesn't solve the underlying problem though. If a Protected Mode boundary is crossed, very unexpected behavior including hangs, element location not working, and clicks not being propagated, could result. To help warn people of this potential problem, the capability was given big scary-sounding names like INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS in Java and IntroduceInstabilityByIgnoringProtectedModeSettings in .NET. We really thought that telling the user that using this setting would introduce potential badness in their code would discourage its use, but it turned out not to be so.

  • 浏览器缩放级别:浏览器缩放级别必须设置为 100%,以便本机鼠标事件可以设置为正确的坐标。

  • Browser Focus:挑战在于 IE 本身似乎没有完全尊重我们发送给 IE 浏览器的 Windows 消息 window(WM_MOUSEDOWN 和 WM_MOUSEUP)如果 window 没有焦点。具体来说,被单击的元素将在其周围获得焦点 window,但元素 不会处理 单击。可以说,我们根本不应该发送消息;相反,我们应该使用 SendInput() API,但是 API 明确要求 window 获得焦点。

您可以在

中找到详细的讨论

在尝试了多种方法并等待并使用上述答案的设置后,我使用了以下代码,即将鼠标移动到元素并执行点击操作。

Actions actions = new Actions(d1);
actions.moveToElement(clickurl).click().build().perform();

js.executeScript("arguments[0].click();",clickurl);

我用下面的问题得出了这个结论—— Selenium click not always working