2

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

  • 页面 - 1 - 登录网页
  • 登录后,会出现一个 URL(我们称之为元素 1)
  • 单击元素 1 后,网页再次加载,我需要单击另一个元素(我们称之为元素 2)。

问题 - 驱动程序被卡住,元素 1 没有被点击或添加足够的等待元素 1 被点击但现在驱动程序卡在这个流程中,正如您可以从下面的代码中观察到的那样,一旦clickurl.click()被调用然后 10 秒后我应该收到一条消息那“睡眠完成..现在我们回到调用类

但相反,我得到了例外。

代码 -

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 ");`

系统详情 -

  • InternetExplorerDriver 服务器(64 位)3.14.0.0
  • 操作系统名称:“Windows 10”
  • Java 版本:“1.8.0_191”

其他详情 -

  • 请注意,单击元素 1 后,我使用driver.switchTo().defaultContent();

错误详情 -

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.
4

2 回答 2

3

此错误消息...

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”

超文本传输​​协议 (HTTP) 500 内部服务器错误响应代码表示服务器遇到了阻止它完成请求的意外情况。

此错误响应是通用的“包罗万象”响应。有时,服务器管理员会记录错误响应,例如 500 状态代码以及有关请求的更多详细信息,以防止将来再次发生错误。


HTTP 状态:“408”

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

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


解决方案

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

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

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

  • 保护模式:在 Windows Vista 或 Windows 7 上的 Internet Explorer 7 或更高版本上,您必须将每个区域的保护模式设置设置为相同的值。该值可以打开或关闭,只要每个区域都相同。要设置保护模式设置,您必须从“工具”菜单中选择“Internet 选项”,然后单击“安全”选项卡。对于每个区域,标签底部都有一个标记为Enable Protected Mode的复选框。

保护模式设置

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

但是,使用该功能并不能解决根本问题。如果跨越保护模式边界,可能会导致非常意外的行为,包括挂起、元素位置不起作用以及点击不传播。为了帮助警告人们这个潜在的问题,该功能被赋予了听起来很吓人的名字,比如INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINSJava.NETIntroduceInstabilityByIgnoringProtectedModeSettings中。我们真的认为告诉用户使用此设置会在他们的代码中引入潜在的错误会阻止其使用,但事实并非如此。

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

  • 浏览器焦点:挑战在于如果窗口没有焦点,IE 本身似乎不完全尊重我们发送给 IE 浏览器窗口(WM_MOUSEDOWN 和 WM_MOUSEUP)的 Windows 消息。具体来说,被点击的元素会收到一个围绕它的焦点窗口,但点击不会被该元素处理。可以说,我们根本不应该发送消息。相反,我们应该使用 SendInput() API,但该 API 明确要求窗口具有焦点。

您可以在Selenium 中的单击作为双击中找到详细讨论

于 2018-12-11T13:42:54.263 回答
1

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

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

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

我用下面的问题得出了这个结论 - Selenium click 并不总是有效

于 2018-12-17T06:38:44.953 回答