【问题标题】:Unable to manage random popup in selenium无法管理硒中的随机弹出窗口
【发布时间】:2018-02-09 06:01:40
【问题描述】:

我想在自动化过程中不断检查是否弹出弹出窗口然后关闭它,否则继续进行中的测试用例。

我已经阅读了许多互联网上的答案,但对于如何不断检查弹出窗口没有帮助。

我可以构建一个函数来检查它,但是在每一行代码之后调用该函数不是一个好习惯,所以寻找一些简短而有效的解决方案。

【问题讨论】:

    标签: java selenium-webdriver popup


    【解决方案1】:

    为了每次都保持检查,不重复每个方法中的代码,我会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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多