Как получить скриншот с сервера RemoteWebDriver вместо локального FirefoxDriver? - PullRequest
9 голосов
/ 06 июля 2011

Я запускаю тест Selenium WebDriver на удаленном ПК с моего ноутбука (java-клиента) с помощью RemoteWebDriver.Но RemoteWebDriver не предоставил скриншот API, чтобы напрямую получить скриншот удаленного ПК.Много гуглил, но нашел, кажется, нужно использовать Json API, чтобы получить его напрямую с сервера remoteWebDriver.Кто-нибудь может дать мне инструкцию о том, как это сделать?Спасибо.

Ответы [ 5 ]

12 голосов
/ 06 июля 2011

* * * * * * * * * * * * * RemoteWebDriver должно быть дополнено, прежде чем вы сможете использовать функцию скриншота Как вы уже не сомневаетесь, попытка произнесения без увеличения приводит к исключению.

WebDriver driver = new RemoteWebDriver( ... );
driver           = new Augmenter().augment( driver );
( (TakesScreenshot)driver ).getScreenshotAs( ... );

5 голосов
/ 30 января 2014

Мне удалось заставить это работать ... вот что вам нужно сделать:

1) Создать новый файл класса в каталоге Util или где-то

package com.util;

import java.net.URL;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.DriverCommand;
import org.openqa.selenium.remote.RemoteWebDriver;

public class ScreenShotRemoteWebDriver extends RemoteWebDriver implements TakesScreenshot {

    public ScreenShotRemoteWebDriver(URL url, DesiredCapabilities dc) {

        super(url, dc);

    }

    @Override
    public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException {

        if ((Boolean) getCapabilities().getCapability(CapabilityType.TAKES_SCREENSHOT)) {
            return target.convertFromBase64Png(execute(DriverCommand.SCREENSHOT).getValue().toString());
        }
        return null;

    }

}

2) Затем ... где бы вы ни запускали RemoteWeDriver, замените его следующим кодом:

driver = new ScreenShotRemoteWebDriver(new URL(-PUT YOUR HUB URL HERE-),cap);

Ваши снимки экрана будут храниться локально.

Надеюсь, это поможет.

3 голосов
/ 27 июля 2012

Я думаю, что это лучший способ:

public<T> Object getScreenshotAs(OutputType<T> outputType) {
    Augmenter augmenter = new Augmenter(); 
    TakesScreenshot ts = (TakesScreenshot) augmenter.augment(driver);
    return ts.getScreenshotAs(outputType);
}
0 голосов
/ 04 июня 2013

RemoteWebDriver не реализует TakesScreenShot, и описанные здесь методы для приведения экземпляра RemoteWebDriver к TakesScreenShot вызовут исключение ClassCastException.Я посмотрю, смогу ли я найти решение, поскольку мне интересно делать то же самое.

Augmenter "улучшит интерфейсы, реализованные этим экземпляром WebDriver, если этот экземпляр является RemoteWebDriver".В зависимости от того, как настроен RemoteWebDriver и как работает сервер selenium на удаленном хосте, можно получить снимок экрана с помощью org.openqa.selenium.remote.Augmenter.

У меня естьнастроил RemoteWebDriver для использования возможностей DesiredCapabilities.htmlUnit (), и это дает ClassCastError.Если RemoteWebDriver сконфигурирован с возможностями драйвера, который реализует интерфейс TakesScreenshot, то ClassCastException может не возникнуть, хотя я еще не проверял это.

Из интерфейса TakesScreenshot известны следующие драйверы реализации: AndroidDriver, AndroidWebDriver, ChromeDriver, EventFiringWebDriver, FirefoxDriver, InternetExplorerDriver, IPhoneDriver, IPhoneSimulatorDriver и SafariDriver

0 голосов
/ 13 июня 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...