Загрузка файлов через WebDriver на SauceLabs

Добрый день.

Необходимо загружать файл фотографии на сайте на профиле пользователя с помощью WebDriver.

Проблема: тесты запускаются на SauceLabs, который не поддерживает библиотеку Sikuli.
По их информации причина в том, что процент клиентов, использующих данную библиотеку, относительно невелик.

Подскажите, как Вы решали подобную проблему с загрузкой файла в тестах на SauceLabs?

Вот в этой теме Загрузка файла автоматически в Selenium WebDriver предлагались некоторые варианты для решения подобной проблемы, посмотри может что подойдёт.

Кратко:

  1. sikuli (здесь не подходит)
  2. через генерацию дополнительного html-кода при помощи Javascript и использования этого кода через WebDriver
  3. напрямую вызвать POST-запрос для отсылки файла
  4. и др.

Вам надо использовать setFileDetector вместе с RemoteWebDriver. (Я подразумеваю вам надо на Java) Это уже частично обсуждалось. Темы указаны ниже:

Ну и вот пример сценария прямо от SauceLabs

import junit.framework.Assert;
import junit.framework.TestCase;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.*;
import java.net.URL;
import java.util.concurrent.TimeUnit;
 
public class TestingUploadSe2Sauce extends TestCase {
    private RemoteWebDriver driver;
 
    public void setUp() throws Exception {
        DesiredCapabilities capabillities = DesiredCapabilities.firefox();
        capabillities.setCapability("version", "7");
        capabillities.setCapability("platform", Platform.XP);
        capabillities.setCapability("selenium-version", "2.18.0");
        capabillities.setCapability("name", "Remote File Upload using Selenium 2's FileDetectors");
 
        driver = new RemoteWebDriver(
           new URL("http://<username>:<api-key>@ondemand.saucelabs.com:80/wd/hub"),
           capabillities);
        driver.setFileDetector(new LocalFileDetector());
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }
 
    public void testSauce() throws Exception {
        driver.get("http://sso.dev.saucelabs.com/test/guinea-file-upload");
        WebElement upload = driver.findElement(By.id("myfile"));
        upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
        driver.findElement(By.id("submit")).click();
        driver.findElement(By.tagName("img"));
        Assert.assertEquals("darkbulb.jpg (image/jpeg)", driver.findElement(By.tagName("p")).getText());
    }
 
    public void tearDown() throws Exception {
        driver.quit();
    }
}

http://sauceio.com/index.php/2012/03/selenium-tips-uploading-files-in-remote-webdriver/

5 лайков

Спасибо, Михаил. Решение помогло.

1 лайк

Ну я рад, тогда ставьте лайк по комментом :smile:

Лайк это хорошо, но когда человек отписывается о том помогло ли решение - это гораздо полезнее для будущих вопрошающих (да и для отвечающих тоже). Все бы так делали!

1 лайк

Ну в идеале, хорошо, чтобы каждый кто ищет ответ на вопрос, при решении своей проблемы приблизительно показал, как он сделал у себя. @GarikRocks буду благодарен, если укажите как сделали у себя.

Реализовал метод uploadFile() в классе, предоставляющем методы для работы с веб-элементами страницы.

/**
	 * Uploads a file
	 * 
	 * @param p_webElement
	 *            Web element instance
	 * @param p_pathToFile
	 *            Path to file for uploading
	 */
	public void uploadFile(WebElement p_webElement, String p_pathToFile)
	{
		log().debug("Upload a file", p_webElement, p_pathToFile);

		File file = new File(p_pathToFile);
		type(p_webElement, file.getAbsolutePath());
	}

	/**
	 * Types value in a text field
	 * 
	 * @param p_webElement
	 *            WebElement instance
	 * @param p_value
	 *            Text value
	 */
	public void type(WebElement p_webElement, String p_value)
	{
		log().debug("Type a value", p_webElement, p_value);

		try
		{
			p_webElement.sendKeys(p_value);
		}
		catch (Exception p_ex)
		{
			log().warn("Cannot type a value to the text field", p_webElement);
		}
	}

Проверка того, что файл загружен, будет происходить на уровне тестовых методов.

сообщение для @ignatenko_rost

Тебе в этой теме уже ответили. Пробовал? Какие результаты?

За то, что задаешь один и тот же вопрос в разных топиках (причём старых и не в тему), и при этом не отписываешься по результатам (помогло / не помогло), легко можно словить бан. Отпишись в этой теме по результатам. Здесь твое сообщение будет скрыто