单击关闭 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,所以你将无法直接调用 WebDriverWait 和 ExpectedConditions,您必须创建一个方法。您可以在
中找到相关的详细讨论
结尾
在这里你可以找到关于
的相关讨论
我不想回答我自己的问题,但在这种情况下,这是唯一有效的解决方案:
Actions builder = new Actions(driver);
builder.moveToElement(closeTestTourButton).build().perform();
builder.sendKeys(Keys.ENTER).perform();
诚然,这不是最优雅的解决方案,但经过两天的尝试,这是唯一有效的解决方案。
在 selenium 中,我成功切换到包含模态 window:
的 iFramedriver.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,所以你将无法直接调用 WebDriverWait 和 ExpectedConditions,您必须创建一个方法。您可以在 中找到相关的详细讨论
结尾
在这里你可以找到关于
我不想回答我自己的问题,但在这种情况下,这是唯一有效的解决方案:
Actions builder = new Actions(driver);
builder.moveToElement(closeTestTourButton).build().perform();
builder.sendKeys(Keys.ENTER).perform();
诚然,这不是最优雅的解决方案,但经过两天的尝试,这是唯一有效的解决方案。