自定义WebDriver无法与Selenium Actions方法进行交互

时间:2018-05-06 10:07:50

标签: java selenium selenium-webdriver

我必须使用Selenium Actions类来使用doubleclick方法与页面上的某些元素进行交互。这对WebDriver(driver = DriverFactory.open(browserType);)运行良好,但当我将其转换为我自己的自定义WebDriver时,不会执行双击。

当我在调试模式下运行时,我可以看到使用自定义驱动程序调用了doubleclick方法,但鼠标被评估为null。

有谁知道为什么我的自定义驱动程序不能与Actions一起使用?

package utilities;

import java.util.List;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class CustomWebDriver implements WebDriver, JavascriptExecutor
{
    private WebDriver driver;

    private boolean hasQuit = false;

    public CustomWebDriver(String browserType) 
    {
        driver = DriverFactory.open(browserType);
        hasQuit = false;
    }

    @Override
    public void get(String url)
    {
        driver.get(url);
    }

    @Override
    public String getCurrentUrl()
    {
        return driver.getCurrentUrl();
    }

    @Override
    public String getTitle()
    {
        return driver.getTitle();
    }

    @Override
    public List<WebElement> findElements(By by)
    {
        return driver.findElements(by);
    }

    @Override
    public WebElement findElement(By by)
    {
        return driver.findElement(by);
    }

    @Override
    public String getPageSource()
    {
        return driver.getPageSource();
    }

    @Override
    public void close()
    {
        driver.close();
    }

    @Override
    public void quit()
    {
        driver.quit();
        hasQuit = true;
    }

    @Override
    public Set<String> getWindowHandles()
    {
        return driver.getWindowHandles();
    }

    @Override
    public String getWindowHandle()
    {
        return driver.getWindowHandle();
    }

    @Override
    public TargetLocator switchTo()
    {
        return driver.switchTo();
    }

    @Override
    public Navigation navigate()
    {
        return driver.navigate();
    }

    @Override
    public Options manage()
    {
        return driver.manage();
    }

    public boolean hasQuit()
    {
        return hasQuit;
    }

    @Override
    public Object executeScript(String script, Object... args)
    {
        return ((JavascriptExecutor) driver).executeScript(script, args);
    }

    @Override
    public Object executeAsyncScript(String script, Object... args)
    {
        return ((JavascriptExecutor) driver).executeAsyncScript(script, args);
    }
}

1 个答案:

答案 0 :(得分:1)

自定义WebDriver需要实现Interactive接口。 Actions类在自己的perform()方法中调用此接口的perform()方法。

您可能还需要实现HasInputDevices界面。

您也可以扩展现有的RemoteWebDriver并对其进行自定义。使您免于重复方法。