0

私はセレンでスクリーンショットコードを試していました。以下はそのコードです:

File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.File);

上記の行で、TakesScreenshot はインターフェイスであり、getScreenshotAs はメソッドです。このことから私が理解していることは、ドライバーを TakesScreenshot インターフェイスに型キャストしていることです。これは基本的に、ドライバーがこれから TakesScreenshot のように動作し、その後 getScreenshotAs メソッドが実行されることを意味します。

ここでの私の質問は、インターフェースは抽象メソッドしか持てないということです。したがって、このメソッドの定義がないため、 getScreenshotAs メソッドは TakesScreenshot インターフェイスを介してどのように実行されますか。より正確には、 getScreenshotAs メソッドが定義されている場所と、上記のコード行はどのように機能しますか?


さらにいくつかの詳細を追加します。

TakesScreenshot --> インターフェース

ドライバー --> ChromeDriver クラスのインスタンス (WebDriver ドライバー = new ChromeDriver())

getScreenshotAs --> TakesScreenshot インターフェイスのメソッド。

上記のコードは、Selenium で Web ページのスクリーンショットを撮るために使用されます。

4

3 に答える 3

0

まあ、私が理解しているように、それは実際にはセレン固有の質問ではなく、基本的な Java の質問です。

あなたが提供した式の意味:

((TakesScreenshot) driver).getScreenshotAs(OutputType.File)

driver以下は次のとおりです。変数のタイプが何であれ、この行では、メソッドTakesScreenshotを持つインターフェースを実装していることを確認していますgetScreenshotAs。したがって、型をキャストして、オブジェクトのメソッドTakesScreenshotを呼び出します。このメソッドの実装は、どちらであっても実際のクラス内にあります。getScreenshotAsdriverdriver

質問コードに非常に近い例を挙げます (このメソッドを受け入れるObjectようにしたので、ターゲット インターフェイスにキャストoする必要があります。実際のコードでは実行しないでください)。

public void log(Object o) {
  ((Printable) o).print();
}

Printableメソッドとのインターフェースはどこにありますかprint

public interface Printable {
  void print();
}

Printableしたがって、 likeの実装がある場合

public class Greeting implements Printable {

  @Override
  public void print() {
    System.out.println("Hello, username");
  }

}

私たちは呼び出すことができます

log(new Greeting())

その結果、「こんにちは、ユーザー名」という行になります

編集:

JavaDoc to selenium でわかるように、WebDriverインターフェースはインターフェースを拡張しません TakesScreenshot。したがって、driver変数のタイプがWebDriverインターフェイスの場合は、キャストする必要があります。-コンパイラWebDriver driver = new ChromeDriver()の型の参照しかありません。WebDriver実際のクラスはChromeDriverコンパイラであるという事実にもかかわらず、それを知りません。したがって、この場合、getScreenshotAsメソッドを呼び出すには、キャストdriverする必要があります (そして、とインターフェイスの両方を実装するインスタンスであるためTakesScreenshot安全です)。その後、インターフェイスからメソッドを呼び出すことができます。driverChromeDriverWebDriverTakesScreenshotgetScreenshotAsTakesScreenshot

まあ、私が理解しているように、それは実際にはセレン固有の質問ではなく、基本的な Java の質問です。

あなたが提供した式の意味:

((TakesScreenshot) driver).getScreenshotAs(OutputType.File)

driver以下は次のとおりです。変数のタイプが何であれ、この行では、メソッドTakesScreenshotを持つインターフェースを実装していることを確認していますgetScreenshotAs。したがって、型をキャストして、オブジェクトのメソッドTakesScreenshotを呼び出します。このメソッドの実装は、どちらであっても実際のクラス内にあります。getScreenshotAsdriverdriver

質問コードに非常に近い例を挙げます (このメソッドを受け入れるObjectようにしたので、ターゲット インターフェイスにキャストoする必要があります。実際のコードでは実行しないでください)。

public void log(Object o) {
  ((Printable) o).print();
}

Printableメソッドとのインターフェースはどこにありますかprint

public interface Printable {
  void print();
}

Printableしたがって、 likeの実装がある場合

public class Greeting implements Printable {

  @Override
  public void print() {
    System.out.println("Hello, username");
  }

}

私たちは呼び出すことができます

log(new Greeting())

その結果、「こんにちは、ユーザー名」という行になります

編集:

JavaDoc to selenium でわかるように、WebDriverインターフェースはインターフェースを拡張しません TakesScreenshot。したがって、driver変数のタイプがWebDriverインターフェイスの場合は、キャストする必要があります。-コンパイラWebDriver driver = new ChromeDriver()の型の参照しかありません。WebDriver実際のクラスはChromeDriverコンパイラであるという事実にもかかわらず、それを知りません。したがって、この場合、getScreenshotAsメソッドを呼び出すには、キャストdriverする必要があります (そして、とインターフェイスの両方を実装するインスタンスであるためTakesScreenshot安全です)。その後、インターフェイスからメソッドを呼び出すことができます。driverChromeDriverWebDriverTakesScreenshotgetScreenshotAsTakesScreenshot

WebDriver driver = new ChromeDriver();
// driver.getScreenshotAs(OutputType.File); // compilation error as there is no method getScreenshotAs in WebDriver interface
((TakesScreenshot) driver).getScreenshotAs(OutputType.File); // ok after explicit casting
于 2017-10-08T09:51:12.013 に答える