簡體   English   中英

如何裝飾硒WebDriver類?

[英]how to decorate the selenium WebDriver class?

我想向WebDriver類添加一些功能。 我試圖使用模式裝飾器。 我認為在這種情況下最好將功能添加到WebDriver類而不更改它。

這是我的代碼:

public abstract class DriverExtends extends RemoteWebDriver {

   protected Log logger = LogFactory.getLog(getClass());
   protected RemoteWebDriver rwd;
   protected final int SLEEP = 10;

   public DriverExtends(RemoteWebDriver driver) {
         rwd = driver;
   }

   /**
   * Determines whether an element is present on the page.
   * @param by The search item.
   * @param log if true, logs a message in the log in the absence of the element. False otherwise.
   * @return true if the element is present, false otherwise.
   */
   public boolean isElementPresent(By by, boolean log) {
         try{
                (new WebDriverWait(rwd, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(by));
                return true;
         } catch(NoSuchElementException e) {
                if(log) {
                       logger.warn("L'élément est absent : "+ e.getMessage());
                }
                return false;
         }
   }

   /**
   * Allows click on a submenu hide default.
   * @param by The link to click. Example (By.linkText ("Search"));
   */
   public void loadMenu(By by) {
         rwd.findElement(By.id("bouton_menu")).click();
         ((JavascriptExecutor)rwd).executeScript("$(\".menu2\").show()");
         rwd.findElement(by).click();
   }
}

FirefoxDriverExtends.class

public class FirefoxDriverExtends extends DriverExtends {

       public FirefoxDriverExtends (FirefoxDriver driver) {
             super(driver);
       }

}

我的測試用例:

public class CreatePeople extends DefaultTestCaseWithParam<PersonLoaded> {

   @Override
   public boolean test(DriverExtends driver, PersonLoaded p) throws InterruptedException, TimeoutException {
         System.out.println("CreatePeople.test() - " + p);
         driver.loadMenu(By.linkText("Recherche"));
         (new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(By.id("idform:nom_input"))).sendKeys(p.getPrenom());
         driver.findElement(By.id("idform:datenaiss_input")).sendKeys(p.getDateNaiss());
         new Select(driver.findElement(By.id("idform:paysRR"))).selectByValue("Danemark");
         (new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.elementToBeClickable(By.id("idform:villeRR"))).sendKeys("COPENHAGUE");
         driver.findElement(By.id("idform:rechercherRes")).click();
         (new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(By.id("idform:creerRes"))).click();
         new Select((new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(By.id("People:selecGestio")))).selectByVisibleText("SELENIUM-UN SELENIUM");
         driver.findElement(By.id("People:adresse")).sendKeys("01 rue du test");
         driver.findElement(By.id("People:telT")).sendKeys("0102030405");
         new Select(driver.findElement(By.id("People:posS"))).selectByVisibleText("someText");
         new Select((new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(By.id("People:categAD")))).selectByVisibleText("someText");
         new Select(driver.findElement(By.id("People:autoEmploi"))).selectByVisibleText("Armée de l'air");
         new Select((new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(By.id("People:categP")))).selectByVisibleText("someText");
         new Select(driver.findElement(By.id("People:precMili"))).selectByVisibleText("De carrière");
         new Select((new WebDriverWait(driver, SLEEP)).until(ExpectedConditions.presenceOfElementLocated(By.id("People:categH")))).selectByVisibleText("someText");
         driver.findElement(By.id("id=People:date_debut-service_input")).click();
         driver.findElement(By.linkText("1")).click();
         return true;
   }
}

這是我得到的錯誤:

uild info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'UCFC4DD43D730B', ip: '36.138.1.237', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_25'
Driver info: driver.version: RemoteWebDriver
org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died.
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'UCFC4DD43D730B', ip: '36.138.1.237', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_25'
Driver info: driver.version: RemoteWebDriver
       at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:589)
-Start of the timer for "Test 4 - selenium.tests.testsuites.TestSuitePeople.testCreatePeople"
09/04/2014 15:10:00 (DbUnit.java:173)  [INFO ]: Désactivation des contraintes
       at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:610)
       at org.openqa.selenium.remote.RemoteWebDriver.getScreenshotAs(RemoteWebDriver.java:320)
       at selenium.utils.jUnit.SeleniumTestWatcher.failed(SeleniumTestWatcher.java:68)
       at org.junit.rules.TestWatchman$1.evaluate(TestWatchman.java:51)
       at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
       at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
       at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
       at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
       at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
       at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
       at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
       at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
       at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NullPointerException
       at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:568)
       ... 22 more

這是我第一次使用裝飾器模式。 那我錯過了什么? :)

我認為,問題在於RemoteWebDriver的初始化。 您無法將firefox驅動程序注入RWD對象,而不能指定功能。 檢查此文檔。

好的,我已經找到方法。 這是解決方案。 在裝飾器模式中,必須將裝飾對象的所有方法與裝飾器對象進行映射。

首先,我們可以看到RemoteWebDriver.class是所有webDriver對象的超類。 因此,要裝飾RemoteWebDriver,我們必須創建實現RemoteWebDriver所有接口的類。

public abstract class DriverCustom implements WebDriver, JavascriptExecutor,
FindsById, FindsByClassName, FindsByLinkText, FindsByName,
FindsByCssSelector, FindsByTagName, FindsByXPath,
HasInputDevices, HasCapabilities, TakesScreenshot {

    //Our decorated object
protected RemoteWebDriver rwd;

public DriverCustom(RemoteWebDriver driver) {
    rwd = driver;
}

// custom methods to add to the decorator. Must be public.

}

接下來,我們需要通過瀏覽器實現來實現此裝飾器。 讓我們來看一個Firefox示例。 在此類中,我們需要將所有方法映射到相應的FirefoxDriver類。

public class FirefoxDriverCustom extends DriverCustom {

    // Add decorated object to decorator
public FirefoxDriverCustom(FirefoxDriver driver) {
    super(driver);
}

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

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

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

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

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

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

@Override
public void close() {
    rwd.close();

}

@Override
public void quit() {
    rwd.close();

}

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

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

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

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

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

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

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

@Override
public WebElement findElementById(String using) {
    return rwd.findElementById(using);
}

@Override
public List<WebElement> findElementsById(String using) {
    return rwd.findElementsById(using);
}

@Override
public WebElement findElementByClassName(String using) {
    return rwd.findElementByClassName(using);
}

@Override
public List<WebElement> findElementsByClassName(String using) {
    return rwd.findElementsByClassName(using);
}

@Override
public WebElement findElementByLinkText(String using) {
    return rwd.findElementByLinkText(using);
}

@Override
public List<WebElement> findElementsByLinkText(String using) {
    return rwd.findElementsByLinkText(using);
}

@Override
public WebElement findElementByPartialLinkText(String using) {
    return rwd.findElementByPartialLinkText(using);
}

@Override
public List<WebElement> findElementsByPartialLinkText(String using) {
    return rwd.findElementsByPartialLinkText(using);
}

@Override
public WebElement findElementByName(String using) {
    return rwd.findElementByName(using);
}

@Override
public List<WebElement> findElementsByName(String using) {
    return findElementsByName(using);
}

@Override
public WebElement findElementByCssSelector(String using) {
    return rwd.findElementByCssSelector(using);
}

@Override
public List<WebElement> findElementsByCssSelector(String using) {
    return rwd.findElementsByCssSelector(using);
}

@Override
public WebElement findElementByTagName(String using) {
    return rwd.findElementByTagName(using);
}

@Override
public List<WebElement> findElementsByTagName(String using) {
    return rwd.findElementsByTagName(using);
}

@Override
public WebElement findElementByXPath(String using) {
    return rwd.findElementByXPath(using);
}

@Override
public List<WebElement> findElementsByXPath(String using) {
    return rwd.findElementsByXPath(using);
}

@Override
public Keyboard getKeyboard() {
    return rwd.getKeyboard();
}

@Override
public Mouse getMouse() {
    return rwd.getMouse();
}

@Override
public Capabilities getCapabilities() {
    return rwd.getCapabilities();
}

@Override
public <X> X getScreenshotAs(OutputType<X> target)
        throws WebDriverException {
    return rwd.getScreenshotAs(target);
}

// We can also add some specific firefox's methods to our decorator class.

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM