在硒中,我成功切换到包含模态窗口的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;
}
测试继续进行,但由于尝试执行某项操作而失败,但是由于仍然打开的模态窗口,因此无法进行测试。
答案 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
在这里您可以找到有关Ways to deal with #document under iframe的相关讨论
答案 2 :(得分:0)
我不想回答自己的问题,但是在这种情况下,这是唯一有效的解决方案:
Actions builder = new Actions(driver);
builder.moveToElement(closeTestTourButton).build().perform();
builder.sendKeys(Keys.ENTER).perform();
当然,这不是最优雅的解决方案,但经过两天的尝试,它是唯一可行的解决方案。