Як зробити знімок екрана певного елемента, а не цілої сторінки, використовуючи Selenium Webdriver?


83

На даний момент я намагаюся зробити знімок екрана за допомогою Selenium WebDriver. Але я можу отримати лише знімок екрана на всю сторінку. Однак я хотів просто захопити частину сторінки або, можливо, просто конкретний елемент на основі ідентифікатора або будь-якого конкретного локатора елементів. (Наприклад, я хочу зробити знімок із зображенням id = "Butterfly")

Чи є спосіб зробити знімок екрана за вибраним елементом чи елементом?


1
AFAIK, об'єкт призначений лише для захоплення цілої сторінки. У нас немає функції скріншоту, яка приймає ідентифікатор елемента або ім’я як вхідні дані.
Гемант

Будь-хто міг сказати мені, що таке виклик методу для BUfferedImage у c #? Я не міг знайти жодного подібного методу, пов’язаного з цим.
fj123

Відповіді:


119

Ми можемо отримати скріншот елемента, обрізавши весь знімок сторінки, як показано нижче:

driver.get("http://www.google.com");
WebElement ele = driver.findElement(By.id("hplogo"));

// Get entire page screenshot
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
BufferedImage  fullImg = ImageIO.read(screenshot);

// Get the location of element on the page
Point point = ele.getLocation();

// Get width and height of the element
int eleWidth = ele.getSize().getWidth();
int eleHeight = ele.getSize().getHeight();

// Crop the entire page screenshot to get only element screenshot
BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(),
    eleWidth, eleHeight);
ImageIO.write(eleScreenshot, "png", screenshot);

// Copy the element screenshot to disk
File screenshotLocation = new File("C:\\images\\GoogleLogo_screenshot.png");
FileUtils.copyFile(screenshot, screenshotLocation);

Дякую за відповідь. Однак чому мій веб-драйвер відрізняється від вашого. він використовує IWebDriver, ITakeScreenshot і немає OutputType.FILE та BufferedImage ... я використовую застарілу версію webdriver селен
f

Чи використовуєте ви прив'язку веб-драйвера C #?
Суря

Так, я так думаю. Раніше я використовував RC, і останнім часом я просто перейшов на веб-драйвер.
fj123

Ця реалізація призначена для прив'язки Java. Ця концепція також повинна працювати для C #. Але я не надто обізнаний з мовою C #. Вам потрібно використовувати еквівалентні бібліотеки C # (BufferedImage, ImageIO ...)
Surya

4
Наведений вище код не працює в Chrome. Виняток java.awt.image.RasterFormatException: (y + висота) поза Растром була викинута в рядок BufferedImage eleScreenshot = fullImg.getSubimage (point.getX (), point.getY (), eleWidth, eleHeight);
Ріпон Аль-Васім

14

Ось версія Python 3 із використанням веб-драйвера Selenium та подушки. Ця програма робить знімок екрана всієї сторінки та обрізає елемент залежно від його розташування. Зображення елемента буде доступне як image.png. Firefox підтримує збереження зображення елемента безпосередньо за допомогою element.screenshot_as_png ('ім'я_образа').

from selenium import webdriver
from PIL import Image

driver = webdriver.Chrome()
driver.get('https://www.google.co.in')

element = driver.find_element_by_id("lst-ib")

location = element.location
size = element.size

driver.save_screenshot("shot.png")

x = location['x']
y = location['y']
w = size['width']
h = size['height']
width = x + w
height = y + h

im = Image.open('shot.png')
im = im.crop((int(x), int(y), int(width), int(height)))
im.save('image.png')

Оновлення

Тепер chrome також підтримує скріншоти окремих елементів. Таким чином, ви можете безпосередньо зробити знімок екрана веб-елемента, як зазначено нижче.

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.google.co.in')
image = driver.find_element_by_id("lst-ib").screenshot_as_png 
# or
# element = driver.find_element_by_id("lst-ib")
# element.screenshot_as_png("image.png")

4
Я майже впевнений, що element.sizeце наводиться в балах, тоді як знімок екрана, створений, driver.save_screenshotмає розміри пікселів. Якщо ваш екран має співвідношення пікселів до точки, відмінне від 1 (наприклад, Retina MacBooks має два пікселі на точку - співвідношення 2), вам потрібно помножити wі hна це співвідношення.
BallpointBen

нова версія змогла використовувати element.screenshot ('elemenent.png'), див. відповідь @ rovr138
tinyhare

@tinyhare Він був доступний у Firefox лише тоді, коли відповідь була створена. Думаю, зараз він також доступний у хромі. Оновлення відповіді.
codelord

1
@puppet Для завантаження пам'яті зробіть це. from StringIO import StringIO; from PIL import Image; img = Image.open(StringIO(image))
codelord

1
У мене була подібна проблема, як @puppet. Це те, що мені import io; from PIL import Image; img = Image.open(io.BytesIO(image)); img.save("image.png")
вдалося

9

У Node.js, я написав наступний код, який працює, але він базується не на офіційному WebDriverJS селену, а на базі SauceLabs's WebDriver: WD.js та дуже компактної бібліотеки зображень під назвою EasyImage .

Я просто хочу підкреслити, що ви не можете зробити знімок екрана елемента, але що вам потрібно зробити, це зробити спочатку знімок екрана всієї сторінки, потім вибрати частину сторінки, яка вам подобається, і обрізати цю конкретну частину:

browser.get(URL_TO_VISIT)
       .waitForElementById(dependentElementId, webdriver.asserters.isDisplayed, 3000)
       .elementById(elementID)
        .getSize().then(function(size) {
            browser.elementById(elementID)
                   .getLocation().then(function(location) {
                        browser.takeScreenshot().then(function(data) {
                            var base64Data = data.replace(/^data:image\/png;base64,/, "");
                            fs.writeFile(filePath, base64Data, 'base64', function(err) {
                                if (err) {
                                    console.log(err);
                                } 
                                else {
                                    cropInFile(size, location, filePath);
                                }
                                doneCallback();
                        });
                    });
                });
            }); 

А cropInFileFunction виглядає так:

var cropInFile = function(size, location, srcFile) {
    easyimg.crop({
            src: srcFile,
            dst: srcFile,
            cropwidth: size.width,
            cropheight: size.height,
            x: location.x,
            y: location.y,
            gravity: 'North-West'
        },
        function(err, stdout, stderr) {
            if (err) throw err;
        });
};

Ваша бібліотека EasyImage пошкоджена: "ImageMagickMissingError"
Нізар Б.

9

Фреймворк ASHOT від Яндекса можна використовувати для створення знімків екрана в сценаріях Selenium WebDriver для

  • повні веб-сторінки
  • веб-елементів

Цей фреймворк можна знайти на https://github.com/yandex-qatools/ashot .

Код для створення знімків екрану дуже простий:

ЦІЛЬНА СТОРІНКА

screenshot = new AShot().shootingStrategy(
new ViewportPastingStrategy(1000)).takeScreenshot(driver);
ImageIO.write(screenshot.getImage(), "PNG", new File("c:\\temp\\results.png"));

СПЕЦИФІЧНИЙ ВЕБ-ЕЛЕМЕНТ

screenshot = new AShot().takeScreenshot(driver, 
driver.findElement(By.xpath("(//div[@id='ct_search'])[1]")));

ImageIO.write(screenshot.getImage(), "PNG", new File("c:\\temp\\div_element.png"));

Докладніше та інші зразки коду див. У цій статті .


Будьте обережні , ви можете також необхідні .shootingStrategy(ShootingStrategies.viewportPasting(100))також з SPECIFIC WEB ELEMENTрежимом, або він не може охопити весь елемент.
user1686407

8

Для всіх, хто запитує код у C #, нижче наведено спрощену версію моєї реалізації.

public static void TakeScreenshot(IWebDriver driver, IWebElement element)
{
    try
    {
        string fileName = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".jpg";
        Byte[] byteArray = ((ITakesScreenshot)driver).GetScreenshot().AsByteArray;
        System.Drawing.Bitmap screenshot = new System.Drawing.Bitmap(new System.IO.MemoryStream(byteArray));
        System.Drawing.Rectangle croppedImage = new System.Drawing.Rectangle(element.Location.X, element.Location.Y, element.Size.Width, element.Size.Height);
        screenshot = screenshot.Clone(croppedImage, screenshot.PixelFormat);
        screenshot.Save(String.Format(@"C:\SeleniumScreenshots\" + fileName, System.Drawing.Imaging.ImageFormat.Jpeg));
    }
    catch (Exception e)
    {
        logger.Error(e.StackTrace + ' ' + e.Message);
    }
}

Дякую. Це було дуже корисно, і це було точно і ідеально.
Щавель Веспер

5

Я витратив багато часу на створення знімка екрана, і я хочу зберегти ваш. Я використовував хром + селен + с #, результат був жахливим. Нарешті я написав функцію:

driver.Manage().Window.Maximize();
             RemoteWebElement remElement = (RemoteWebElement)driver.FindElement(By.Id("submit-button")); 
             Point location = remElement.LocationOnScreenOnceScrolledIntoView;  

             int viewportWidth = Convert.ToInt32(((IJavaScriptExecutor)driver).ExecuteScript("return document.documentElement.clientWidth"));
             int viewportHeight = Convert.ToInt32(((IJavaScriptExecutor)driver).ExecuteScript("return document.documentElement.clientHeight"));

             driver.SwitchTo();

             int elementLocation_X = location.X;
             int elementLocation_Y = location.Y;

             IWebElement img = driver.FindElement(By.Id("submit-button"));

             int elementSize_Width = img.Size.Width;
             int elementSize_Height = img.Size.Height;

             Size s = new Size();
             s.Width = driver.Manage().Window.Size.Width;
             s.Height = driver.Manage().Window.Size.Height;

             Bitmap bitmap = new Bitmap(s.Width, s.Height);
             Graphics graphics = Graphics.FromImage(bitmap as Image);
             graphics.CopyFromScreen(0, 0, 0, 0, s);

             bitmap.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);

             RectangleF part = new RectangleF(elementLocation_X, elementLocation_Y + (s.Height - viewportHeight), elementSize_Width, elementSize_Height);

             Bitmap bmpobj = (Bitmap)Image.FromFile(filePath);
             Bitmap bn = bmpobj.Clone(part, bmpobj.PixelFormat);
             bn.Save(finalPictureFilePath, System.Drawing.Imaging.ImageFormat.Png); 

1
Це чудово працює, доки ви намагаєтеся захопити елемент, який видно без прокрутки. Коли вам потрібно прокрутити елемент для його захоплення, тоді зміщення y обчислюється вгорі сторінки, яке потім перевищує межі повноекранного зображення. Отже, найпростішим рішенням є або збільшити розмір екрану код this.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); або видалити будь-які непотрібні елементи через css. Правильним рішенням було б розрахувати зміщення у від прокрутки.
Ichwardort

4

Відповідь Сур'ї чудово працює, якщо ви не проти залучити дисковий IO. Якщо ви віддаєте перевагу ні, тоді цей метод може бути кращим для вас

private Image getScreenshot(final WebDriver d, final WebElement e) throws IOException {
    final BufferedImage img;
    final Point topleft;
    final Point bottomright;

    final byte[] screengrab;
    screengrab = ((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES);

    img = ImageIO.read(new ByteArrayInputStream(screengrab));

    //crop the image to focus on e
    //get dimensions (crop points)
    topleft = e.getLocation();
    bottomright = new Point(e.getSize().getWidth(),
                            e.getSize().getHeight());

    return img.getSubimage(topleft.getX(),
                           topleft.getY(),
                           bottomright.getX(),
                           bottomright.getY());
}

Якщо ви віддаєте перевагу, ви можете пропустити оголошення screengrabта замість цього зробити

img = ImageIO.read(
    new ByteArrayInputStream(
        ((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES)));

це чистіше, але я залишив це для ясності. Потім ви можете зберегти його як файл або розмістити в JPanel до душі.


3

Python 3

Спробував селен 3.141.0 та хромедрівер 73.0.3683.68, це працює,

from selenium import webdriver

chromedriver = '/usr/local/bin/chromedriver'
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('window-size=1366x768')
chromeOptions.add_argument('disable-extensions')
cdriver = webdriver.Chrome(options=chromeOptions, executable_path=chromedriver)

cdriver.get('url')
element = cdriver.find_element_by_css_selector('.some-css.selector')

element.screenshot_as_png('elemenent.png')

Не потрібно отримувати повне зображення та отримувати розділ повноекранного зображення.

Можливо, це було недоступно, коли була створена відповідь Рохіта .


2
public void GenerateSnapshot(string url, string selector, string filePath)
    {
        using (IWebDriver driver = new ChromeDriver())
        {
            driver.Navigate().GoToUrl(url);
            var remElement = driver.FindElement(By.CssSelector(selector));
            Point location = remElement.Location;

            var screenshot = (driver as ChromeDriver).GetScreenshot();
            using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray))
            {
                using (Bitmap bitmap = new Bitmap(stream))
                {
                    RectangleF part = new RectangleF(location.X, location.Y, remElement.Size.Width, remElement.Size.Height);
                    using (Bitmap bn = bitmap.Clone(part, bitmap.PixelFormat))
                    {
                        bn.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
                    }
                }
            }
            driver.Close();
        }
    }

2

Якщо ви шукаєте рішення для JavaScript, ось мій суть:

https://gist.github.com/sillicon/4abcd9079a7d29cbb53ebee547b55fba

Основна ідея та ж, спочатку зробіть знімок екрана, а потім обріжте його. Однак для мого рішення не потрібні інші бібліотеки, а лише чистий код API WebDriver. Однак побічним ефектом є те, що це може збільшити навантаження тестового браузера.


Будь ласка, вставте код у свою відповідь, а не посилання на інше джерело
суперсан

2

Ось функція розширення для C #:

public static BitmapImage GetElementImage(this IWebDriver webDriver, By by)
{
    var elements = webDriver.FindElements(by);
    if (elements.Count == 0)
        return null;

    var element = elements[0];
    var screenShot = (webDriver as ITakesScreenshot).GetScreenshot();
    using (var ms = new MemoryStream(screenShot.AsByteArray))
    {
        Bitmap screenBitmap;
        screenBitmap = new Bitmap(ms);
        return screenBitmap.Clone(
            new Rectangle(
                element.Location.X,
                element.Location.Y,
                element.Size.Width,
                element.Size.Height
            ),
            screenBitmap.PixelFormat
        ).ToBitmapImage();
    }
}

Тепер ви можете використовувати його для створення зображення будь-якого елемента, подібного до цього:

var image = webDriver.GetElementImage(By.Id("someId"));

1

Подумайте про використання голки - інструменту для автоматизованого візуального порівняння https://github.com/bfirsh/needle , який має вбудовану функціональність, яка дозволяє робити знімки екрана певних елементів (вибраних селектором CSS). Інструмент працює на WebDriver Selenium, і він написаний на Python.


1

Нижче функції для створення знімка певного елемента в селені. Тут драйвер - це тип WebDriver.

private static void getScreenshot(final WebElement e, String fileName) throws IOException {
  final BufferedImage img;
  final Point topleft;
  final Point bottomright;
  final byte[] screengrab;
  screengrab = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
  img = ImageIO.read(new ByteArrayInputStream(screengrab));
  topleft = e.getLocation();
  bottomright = new Point(e.getSize().getWidth(), e.getSize().getHeight());
  BufferedImage imgScreenshot= 
      (BufferedImage)img.getSubimage(topleft.getX(), topleft.getY(), bottomright.getX(), bottomright.getY());
  File screenshotLocation = new File("Images/"+fileName +".png");    
  ImageIO.write(imgScreenshot, "png", screenshotLocation);
 }

Більше див. Це посилання: [Automation Hub Point] ( automationhubpoint.blogspot.in/2017/01/… )
ER.swatantra

1

код c #:

public Bitmap MakeElemScreenshot( IWebDriver driver, WebElement elem)
{
    Screenshot myScreenShot = ((ITakesScreenshot)driver).GetScreenshot();

    Bitmap screen = new Bitmap(new MemoryStream(myScreenShot.AsByteArray));
    Bitmap elemScreenshot = screen.Clone(new Rectangle(elem.Location, elem.Size), screen.PixelFormat);

    screen.Dispose();

    return elemScreenshot;
}

0
using System.Drawing;
using System.Drawing.Imaging;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;

public void ScreenshotByElement()
{
    IWebDriver driver = new FirefoxDriver();
    String baseURL = "www.google.com/"; //url link
    String filePath = @"c:\\img1.png";      

    driver.Navigate().GoToUrl(baseURL);
    var remElement = driver.FindElement(By.Id("Butterfly"));
    Point location = remElement.Location;

    var screenshot = (driver as FirefoxDriver).GetScreenshot();
    using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray))
    {
        using (Bitmap bitmap = new Bitmap(stream))
        {
            RectangleF part = new RectangleF(location.X, location.Y, remElement.Size.Width, remElement.Size.Height);
            using (Bitmap bn = bitmap.Clone(part, bitmap.PixelFormat))
            {
                bn.Save(filePath, ImageFormat.Png);                        
            }
        }
    }
}

0

Якщо ви отримаєте виняток java.awt.image.RasterFormatException у chrome, або ви хочете прокрутити елемент у вигляді, а потім зробіть знімок екрана.

Ось рішення від відповіді @Surya.

        JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
        Long offsetTop = (Long) jsExecutor.executeScript("window.scroll(0, document.querySelector(\""+cssSelector+"\").offsetTop - 0); return document.querySelector(\""+cssSelector+"\").getBoundingClientRect().top;");

        WebElement ele = driver.findElement(By.cssSelector(cssSelector));

        // Get entire page screenshot
        File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        BufferedImage  fullImg = ImageIO.read(screenshot);

        // Get the location of element on the page
        Point point = ele.getLocation();

        // Get width and height of the element
        int eleWidth = ele.getSize().getWidth();
        int eleHeight = ele.getSize().getHeight();

        // Crop the entire page screenshot to get only element screenshot
        BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), Math.toIntExact(offsetTop),
                eleWidth, eleHeight);
        ImageIO.write(eleScreenshot, "png", screenshot);

        // Copy the element screenshot to disk
        File screenshotLocation = new File("c:\\temp\\div_element_1.png");
        FileUtils.copyFile(screenshot, screenshotLocation);

Я використовую selenium-java-2.53.1, групу компіляції: 'org.seleniumhq.selenium', ім'я: 'selenium-java', версія: '2.53.1', chrome-web-драйвер, я намагаюся обрізати .xpath (".// img [@class = 'captcha']") з веб-сторінки resident.uidai.gov.in/offlineaadhaar , але ваш код не працює належним чином. Його обрізання якоїсь неправильної частини сторінки. Ви можете допомогти мені, як отримати обрізану капчу.
Віджай,

0

Це моя версія, в C #, я в основному отримав більшу частину відповіді Брука і змінив її відповідно до моєї мети

public static byte[] GetElementImage(this IWebElement element)
    {
        var screenShot = MobileDriver.Driver.GetScreenshot();
        using (var stream = new MemoryStream(screenShot.AsByteArray))
        {
            var screenBitmap = new Bitmap(stream);
            var elementBitmap = screenBitmap.Clone(
                new Rectangle(
                    element.Location.X,
                    element.Location.Y,
                    element.Size.Width,
                    element.Size.Height
                ),
                screenBitmap.PixelFormat
            );
            var converter = new ImageConverter();
            return (byte[]) converter.ConvertTo(elementBitmap, typeof(byte[]));
        }
    }

0

Я думаю, що більшість відповідей тут надмірно розроблені. Я зробив це за допомогою двох допоміжних методів, перший, який чекав на елемент на основі будь-якого селектора; а другий, щоб зробити його скріншот.

Примітка: Ми кастовать WebElementдо TakesScreenshotприкладу, таким чином , ми тільки захопити цей елемент в зображенні спеціально. Якщо вам потрібна повна сторінка / вікно, driverзамість цього слід виконати трансляцію .

WebDriver driver = new FirefoxDriver(); // define this somewhere (or chrome etc)

public <T> T screenshotOf(By by, long timeout, OutputType<T> type) {
    return ((TakesScreenshot) waitForElement(by, timeout))
            .getScreenshotAs(type);
}

public WebElement waitForElement(By by, long timeout) {
    return new WebDriverWait(driver, timeout)
            .until(driver -> driver.findElement(by));
}

А потім просто зніміть скріншот, що завгодно, як ви захочете:

long timeout = 5;   // in seconds
/* Screenshot (to file) based on first occurence of tag */
File sc = screenshotOf(By.tagName("body"), timeout, OutputType.FILE); 
/* Screenshot (in memory) based on CSS selector (e.g. first image in body
who's "src" attribute starts with "https")  */
byte[] sc = screenshotOf(By.cssSelector("body > img[href^='https']"), timeout, OutputType.BYTES);

-1

Я вважаю, що це не буде працювати для вас, оскільки ви використовуєте C #, і моє рішення включає бібліотеку Java, однак, можливо, іншим це буде корисно.

Для зйомки власних знімків екрану ви можете використовувати бібліотеку Shutterbug. Конкретним викликом для цієї мети буде:

Shutterbug.shootElement(driver, element).save();

-1

Я пішов за зразком коду з @codeslord, але з якихось причин мені довелося отримати доступ до даних екрану:

 # Open the Firefox webdriver
 driver = webdriver.Firefox()
 # Find the element that you're interested in
 imagepanel = driver.find_element_by_class_name("panel-height-helper")
 # Access the data bytes for the web element
 datatowrite = imagepanel.screenshot_as_png
 # Write the byte data to a file
 outfile = open("imagepanel.png", "wb")
 outfile.write(datatowrite)
 outfile.close()

(за допомогою Python 3.7, Selenium 3.141.0 та Mozilla Geckodriver 71.0.0.7222)


-2

Я використовую модифіковану версію відповіді @ Brook і працюю чудово навіть для елементів, які потребують прокрутки сторінки.

public void TakeScreenshot(string fileNameWithoutExtension, IWebElement element)
{
    // Scroll to the element if necessary
    var actions = new Actions(_driver);
    actions.MoveToElement(element);
    actions.Perform();
    // Get the element position (scroll-aware)
    var locationWhenScrolled = ((RemoteWebElement) element).LocationOnScreenOnceScrolledIntoView;
    var fileName = fileNameWithoutExtension + ".png";
    var byteArray = ((ITakesScreenshot) _driver).GetScreenshot().AsByteArray;
    using (var screenshot = new System.Drawing.Bitmap(new System.IO.MemoryStream(byteArray)))
    {
        var location = locationWhenScrolled;
        // Fix location if necessary to avoid OutOfMemory Exception
        if (location.X + element.Size.Width > screenshot.Width)
        {
            location.X = screenshot.Width - element.Size.Width;
        }
        if (location.Y + element.Size.Height > screenshot.Height)
        {
            location.Y = screenshot.Height - element.Size.Height;
        }
        // Crop the screenshot
        var croppedImage = new System.Drawing.Rectangle(location.X, location.Y, element.Size.Width, element.Size.Height);
        using (var clone = screenshot.Clone(croppedImage, screenshot.PixelFormat))
        {
            clone.Save(fileName, ImageFormat.Png);
        }
    }
}

Два ifs були необхідні (принаймні для хромованого драйвера), оскільки розмір обрізаного зображення перевищував розмір скріншота в 1 піксель, коли потрібна була прокрутка.


Я отримую цю помилку, коли пробую ваш метод: Не вдається привести прозорий проксі-сервер до типу 'OpenQA.Selenium.Remote.RemoteWebElement'
shanabus,

Я використовую це виключно з драйвером Chrome, який драйвер ви використовуєте?
thepirat000

Я також використовую ChromeDriver. У моїх тестах використовується IWebElements, і ми дотримуємося методу PageFactory з пакета nuget OpenQA.Selenium.Support.
shanabus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.