【问题标题】:Close window button clicked but window is not closed单击关闭窗口按钮但窗口未关闭
【发布时间】:2019-09-16 09:28:45
【问题描述】:

在 selenium 中,我成功切换到包含模式窗口的 iFrame:

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@name='intercom-tour-frame']")))

在这个 iFrame 中有一个关闭窗口按钮,点击“成功”但窗口没有关闭。成功是指使用 xpath 找到按钮,并且在我的代码中没有错误地完成操作。

这就是我正在尝试的:

@FindBy(xpath = ("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/span[1]"))
private WebElement closeTestTourButton;

public newCampaignPage clickCloseTestTourButton(WebDriver driver)
{
    delay(5000);

    closeTestTourButton.click();
}

我也试过了:

public newCampaignPage clickCloseTestTourButton(WebDriver driver)
{
    delay(5000);
    Actions builder = new Actions(driver);
    builder.moveToElement(closeTestTourButton).build().perform();
    waitForElementAndClick(closeTestTourButton, driver);
    return this;
}

测试继续但失败,因为它试图做一个动作,但由于模态窗口仍然打开,这是不可能的。

【问题讨论】:

  • 可能是点击了其他元素而不是 close() 按钮。你能发布 html 吗?

标签: java selenium selenium-webdriver webdriverwait pageobjects


【解决方案1】:

尝试使用javascript点击按钮,有时事件可能不会通过正常点击触发。

public newCampaignPage clickCloseTestTourButton(WebDriver driver)
{
    delay(5000);
    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", closeTestTourButton);
    return this;
}

我建议在您的脚本中使用WebDriverWait 而不是延迟。下面是实现。

WebDriverWait wait = new WebDriverWait(driver, 10);

 WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(<someid>)));

【讨论】:

  • 感谢您的回复。 JS 成功关闭了窗口,但随后测试失败,出现 org.openqa.selenium.JavascriptException: JavaScriptError: Document was unloaded。有什么想法吗?
【解决方案2】:

您可能切换并试图过早地click()

关闭窗口按钮上的click(),因为所需元素位于&lt;iframe&gt; 内,因此您必须:

  • 诱导 WebDriverWait 使所需的框架可用并切换到它

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@name='intercom-tour-frame']")));
    
  • 诱导 WebDriverWait 使所需的元素可点击

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[2]/span[1]"))).click();
    
  • 但是当您使用 @FindBy 时,您可能正在 PageObjectModel 中使用 PageFactory,因此您将无法调用 WebDriverWait 直接与 ExpectedConditions 结合使用,您必须创建一个方法。您可以在How to wait for invisibility of an element through PageFactory using Selenium and Java

  • 找到相关的详细讨论

结尾

在这里你可以找到Ways to deal with #document under iframe的相关讨论

【讨论】:

  • 感谢您的回复。不幸的是,这不起作用。它像以前一样“单击”按钮,但模式窗口没有关闭。 supputuri 的 js 建议在关闭窗口时起作用,但在此之后测试立即失败,并出现 org.openqa.selenium.JavascriptException: JavaScriptError: Document was unloaded。有什么想法吗?
  • @ratsstack 有几件事 1) 你有一个 absolute xpath 这可能会使你的测试变得不稳定。 2) 您尚未与我们共享 HTML,因此我们不确定您使用的 xpath 是否唯一标识该元素 3) 当您使用 Java 客户端时,使用 JavascriptExecutor 应该是您的最后选择,但绝不是 first
  • 同意你所说的关于 JS 和 xpath 的内容。 xpath 是正确的,因为 1)我已经通过 chropath 进行了测试,2)JS 方法正在“单击”按钮。我正在使用 abs xpath 以确保我击中了正确的元素。解决此问题后,我会使其更加健壮。
  • 抱歉,HTML,不幸的是,我不能轻易分享它,因为它包含私人信息。我会看看我是否可以充分操纵它,以便我可以分享它,但这将是很多工作:(
【解决方案3】:

我不喜欢回答自己的问题,但在这种情况下,这是唯一有效的解决方案:

Actions builder = new Actions(driver);
builder.moveToElement(closeTestTourButton).build().perform();
builder.sendKeys(Keys.ENTER).perform();

当然,这不是最优雅的解决方案,但经过两天的尝试,它是唯一有效的解决方案。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 2012-09-23
    • 2021-03-28
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多