【发布时间】:2018-02-09 06:01:40
【问题描述】:
我想在自动化过程中不断检查是否弹出弹出窗口然后关闭它,否则继续进行中的测试用例。
我已经阅读了许多互联网上的答案,但对于如何不断检查弹出窗口没有帮助。
我可以构建一个函数来检查它,但是在每一行代码之后调用该函数不是一个好习惯,所以寻找一些简短而有效的解决方案。
【问题讨论】:
标签: java selenium-webdriver popup
我想在自动化过程中不断检查是否弹出弹出窗口然后关闭它,否则继续进行中的测试用例。
我已经阅读了许多互联网上的答案,但对于如何不断检查弹出窗口没有帮助。
我可以构建一个函数来检查它,但是在每一行代码之后调用该函数不是一个好习惯,所以寻找一些简短而有效的解决方案。
【问题讨论】:
标签: java selenium-webdriver popup
为了每次都保持检查,不重复每个方法中的代码,我会implement my own WebDriver
这样做,您可以override 每个 WebDriver 方法并在最基础的级别执行检查和处理弹出窗口。
例子:
public class Selenium implements WebDriver {
private static HashMap<Thread, WebDriver> webdriverPool = new HashMap<Thread, WebDriver>();
private WebDriver driver = null;
private Selenium(WebDriver driver) {
this.driver = driver;
}
public static Selenium get() {
WebDriver currentDriver = webdriverPool.get(Thread.currentThread());
if (currentDriver != null) return new Selenium(currentDriver);
else {
//initialize WebDriver like this
//add switches etc. Return an instance of our Custom class wrapping the WebDriver
return new Selenium(new FirefoxDriver());
}
}
@Override
public void close() {
driver.close();
}
@Override
public WebElement findElement(By arg0) {
handlePopUp();
return driver.findElement(arg0);
}
@Override
public List<WebElement> findElements(By arg0) {
handlePopUp();
return driver.findElements(arg0);
}
@Override
public void get(String arg0) {
driver.get(arg0);
handlePopUp();
}
@Override
public String getCurrentUrl() {
return driver.getCurrentUrl();
}
@Override
public String getPageSource() {
return driver.getPageSource();
}
@Override
public String getTitle() {
return driver.getTitle();
}
@Override
public String getWindowHandle() {
return driver.getWindowHandle();
}
@Override
public Set<String> getWindowHandles() {
return driver.getWindowHandles();
}
@Override
public Options manage() {
return driver.manage();
}
@Override
public Navigation navigate() {
return driver.navigate();
}
@Override
public void quit() {
driver.quit();
}
@Override
public TargetLocator switchTo() {
return driver.switchTo();
}
public void click(WebElement element) {
handlePopUp();
element.click();
}
public void click(By by) {
handlePopUp();
this.findElement(by).click();
}
public void sendKeys(WebElement element, String keys) {
handlePopUp();
element.sendKeys(keys);
}
public void sendKeys(By by, String keys) {
handlePopUp();
this.findElement(by).sendKeys(keys);
}
private void handlePopUp() {
//your custom method
}
要记住的事情很少。如果您还想覆盖click() 和sendKeys() 方法,则必须在某个地方实现它们。由于这些方法是在WebElement 接口中实现的,因此您必须以某种方式创建接口,覆盖由 selenium 创建的接口。这是可能的,但我认为成本太高。
我将click() 和sendKeys() 添加到Selenium 类中。
您必须使用selenium.click(element); 来处理弹出窗口,而不是调用element.click();。
get() 方法处理创建 WebDriver。
使用方法示例:
Selenium selenium = Selenium.get();
WebElement element = selenium.findElement(By.id("id"));
selenium.click(element);
【讨论】: