1

Sauce On Demand インフラストラクチャで Sikuli WebDriver ベースのテストを実行しようとしていました。しかし、RemoteWebDriver に問題があります。

私はこの BaseSikuliWebDriver クラスを持っています

package com.pitito.sikuli.base;

import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

import com.pitito.core.basetests.BaseLoggingTest;
import com.pitito.selenium.webdriver.RemoteWebDriverSession;
import com.pitito.selenium.webdriver.WebDriverScreenshooter;
import com.pitito.sikuli.webdriver.SikuliFirefoxDriver;

/**
 * Base class for all Sikuli WebDriver tests.
 *
 * @author guillem.hernandez
 */
public abstract class BaseSikuliWebDriverTest {

  Map<String, Object> sauceJob = new HashMap<String, Object>();

  private static SikuliFirefoxDriver sikuliDriver;

  protected SikuliFirefoxDriver driver() {
    return getDriver();
  }

  public static SikuliFirefoxDriver getDriver() {
    return sikuliDriver;
  }

  public static void setDriver(SikuliFirefoxDriver driver) {
    BaseSikuliWebDriverTest.sikuliDriver = driver;
  }

  @Override
  @BeforeMethod(alwaysRun = true)
  protected void setup(Method method, Object[] testArguments) {
    super.setup(method, testArguments);
    String sessionId = method.getName() + "_" + testArguments.hashCode();
    DesiredCapabilities caps = DesiredCapabilities.firefox();
    caps.setCapability("id", sessionId);
    caps.setCapability("name", sessionId);
    caps.setCapability(CapabilityType.BROWSER_NAME, "firefox");
    caps.setCapability("platform", Platform.XP);
    caps.setCapability("version", "21");
    try {
    sikuliDriver = (SikuliFirefoxDriver) new Augmenter().augment(new RemoteWebDriver(new URL("http://"
          + RemoteWebDriverSession.USER + ":" + RemoteWebDriverSession.APIKEY
          + "@ondemand.saucelabs.com:80/wd/hub"), caps));
    } catch (MalformedURLException e) {
      e.printStackTrace();
    }
    setDriver(sikuliDriver);
  }

  @Override
  @AfterMethod(alwaysRun = true)
  protected void teardown(ITestResult tr, Method method) {
    if ((logger() != null) && (tr.getStatus() == ITestResult.FAILURE)) {
      logUnexpectedException(tr.getThrowable());
    }
    super.teardown(tr, method);
    sikuliDriver.quit();
  }

  @Override
  protected void logScreenshot(String screenshotName) {
    logResource(new WebDriverScreenshooter(driver(), screenshotName).getScreenshot());
  }
}

私が実装したテストは Sikuli WebDriver の例で、コードは次のとおりです。

package com.pitito.sikuli.tests;

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;

import com.pitito.sikuli.base.BaseSikuliWebDriverTest;
import com.pitito.sikuli.webdriver.ImageElement;

/**
 * Sikuli Firefox WebDriver Automated Test Example.
 *
 * @author guillem.hernandez
 */
public class SikuliGoogleCodeTest extends BaseSikuliWebDriverTest {

  @Test(groups = { "ES" }, description = "Use Sikuli to search on Google Maps")
  public void testSikuliWebDriverPassingExample_ES() {
    verifySikuliWebDriverPassingTest();
  }

  private void verifySikuliWebDriverPassingTest() {
    // visit Google Map
    driver().get("https://maps.google.com/");

    // enter "Denver, CO" as search terms
    WebElement input = driver().findElement(By.id("gbqfq"));
    input.sendKeys("Denver, CO");
    input.sendKeys(Keys.ENTER);

    ImageElement image;

    // find and click on the image of the lakewood area
    try {
      image = driver().findImageElement(new URL("https://dl.dropbox.com/u/5104407/lakewood.png"));

      image.doubleClick();

      // find and click on the image of the kendrick lake area
      image =
          driver().findImageElement(new URL("https://dl.dropbox.com/u/5104407/kendrick_lake.png"));
      image.doubleClick();

      // find and click the Satellite icon to switch to the satellite view
      image = driver().findImageElement(new URL("https://dl.dropbox.com/u/5104407/satellite.png"));
      image.click();

      // find and click the plus button to zoom in
      image = driver().findImageElement(new URL("https://dl.dropbox.com/u/5104407/plus.png"));
      image.click();

      // find and click the link button
      WebElement linkButton = driver().findElement(By.id("link"));
      linkButton.click();
    } catch (MalformedURLException e) {
      e.printStackTrace();
    }
  }
}

テストを実行しようとすると、次のエラーが表示されます。

[Invoker 18958118] Invoking @BeforeMethod BaseSikuliWebDriverTest.setup(java.lang.reflect.Method, [Ljava.lang.Object;)[pri:0, instance:com.pitito.sikuli.tests.SikuliGoogleCodeTest@137008a]
Failed to invoke configuration method com.pitito.sikuli.base.BaseSikuliWebDriverTest.setup:org.openqa.selenium.remote.RemoteWebDriver$$EnhancerByCGLIB$$52a1cf6f cannot be cast to com.pitito.sikuli.webdriver.SikuliFirefoxDriver

問題はここにあります:

sikuliDriver = (SikuliFirefoxDriver) new Augmenter().augment(new RemoteWebDriver(new URL("http://"
          + RemoteWebDriverSession.USER + ":" + RemoteWebDriverSession.APIKEY
          + "@ondemand.saucelabs.com:80/wd/hub"), caps));

SikuliFirefoxDriver をリモートで使用するにはどうすればよいですか? SikuliFirefoxDriver で RemoteWebDriver をキャストするにはどうすればよいですか? 私はそれを行うことができますか?

4

3 に答える 3

2

私の知る限り、Selenium Grid サーバーには、JSON API を介して Sikuli コマンド (および比較のためのバイナリ スクリーンショット) を渡す機能がありません。SauceLabs でさえ、この機能を備えていません。うまくいけば、いつか実装されるレーダー上にあります。SauceLabs フォーラムで、この質問をした人がいます (そして、私も同じ答えでその質問に答えました)。

ブラウザ/Firefox メニューとネイティブ ダイアログを自動化できるようにする予定 のMarionetteという進行中のプロジェクトがあることを私は知っています。

于 2013-11-13T19:17:25.610 に答える
2

sikuli ドライバーのリモートドライバーバージョンを実装しました。それを使用して、このアクションを実行できます。お気軽にフォークしてください: https://github.com/AJ-72/SikuliRemoteWebdriver

于 2015-06-09T09:37:57.843 に答える