单击关闭 window 按钮但 window 未关闭

Close window button clicked but window is not closed

在 selenium 中,我成功切换到包含模态 window:

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

在此 iFrame 中有一个关闭 window 按钮,单击后 "successfully" 但 window 不会关闭。我所说的成功是指使用 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;
}

测试继续但在尝试执行某项操作时失败,但由于模态仍处于打开状态,因此这是不可能的 window。

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

可能您 切换 并试图 click() 为时过早。

click() 关闭 window 按钮 因为所需的元素在 <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,所以你将无法直接调用 WebDriverWaitExpectedConditions,您必须创建一个方法。您可以在

  • 中找到相关的详细讨论

结尾

在这里你可以找到关于

的相关讨论

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

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

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