单击关闭窗口按钮,但窗口未关闭

时间:2019-09-16 09:28:45

标签: java selenium selenium-webdriver webdriverwait pageobjects

在硒中,我成功切换到包含模态窗口的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;
}

测试继续进行,但由于尝试执行某项操作而失败,但是由于仍然打开的模态窗口,因此无法进行测试。

3 个答案:

答案 0 :(得分:2)

尝试使用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>)));

答案 1 :(得分:1)

可能您是切换并尝试过早click()

要关闭关闭窗口按钮上的click() ,因为所需元素位于<iframe>中,因此您必须:

  • 诱导 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

  • 中找到相关的详细讨论

Outro

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

答案 2 :(得分:0)

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

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

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