Загрузка файла через WebDriver

У многих, кто начинает автоматизировать возникает вопрос загрузки файла на сайт.
Решил сделать базовый пример работы с формой на github.com/tit/upload_file.
В нём сильно не хватает примера на Java. Помогите с ним. :slight_smile:

Python

##Ruby

#Java

#C Sharp

1 лайк

@joemast поможешь с java версией?
@dzhariy поможешь с С# версией?

Я товарищу @TIT пулл риквест отправил
https://github.com/tit/upload_file/pulls

Ждемс апрува и добавления в шапку топика :smiley:

Апрувил, спасибо!

1 лайк

Отправил код @TIT по-старинке в личку (нет у меня ни git, ни аккаунта на github) :smile:

1 лайк

Добавил.

1 лайк

Надо переместить примеры в GitHub - atinfo/at.info-knowledge-base: http://automated-testing.info knowledge base on test automation examples

Я уже сделал at.info-knowledge-base/functional test automation/webdriver/file upload at master · atinfo/at.info-knowledge-base · GitHub

@dzhariy @TIT надо будет полезные коды выносить в соответствующие папки в git репозиторий.

Надо бы завести, сейчас это очень нужная вещь, а тем более мы ее берем на вооружение, плюс лишними знания использования git не будут. @joemast как создать аккаунт на github скажи название аккаунта я тебя добавлю в репозиторий.

2 лайка

всем привет! Пожалуйста подскажите, можно ли загрузить файл если тесты
запускаются на удаленном сервере а не локадьно(если да, то интересует
какой будет путь к файлу) проект лежит на репозитории в битбакет, тесты
запускаются на
jenkins

Загружаемый файл в любом случае должен находиться на той машине, где крутиться тест. И путь у него будет локальным. Или я неправильно понял вопрос?

в том то и дело, тесты запускаются не локально, а на удаленном сервере

Если тесты находятся и запускаются на удалённой машине, то и загружаемый файл должен находится на той же самой удалённой машине.

либо его можно сначала скачать на локальную машину, где запускаются тесты, а потом уже загрузить (но зачем?)

Вот тут написано как делать. Если кратко, то используется метод setFileDetector:

all you need to do is use the setFileDetector method to let WebDriver know that you’re uploading files from your local computer to a remote server instead of just typing a path. Almost magically, the file will be base64 encoded and sent transparently through the JSON Wire Protocol for you before writing the fixed remote path

Пример кода оттуда же:

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();

}
}
1 лайк

Помогите пожалуйста с Codeception версией, использую Webdriver ($I->attachFile(’#file’, ‘logotest1.jpg’):wink: Файл прикреляеться но форма не отпраляеться, jQuery говорит: Operation insecure. Я понимаю что это защита браузера от присвоения значения для input file програмно но не могу обойти. Спасибо.

Подскажите, что делаю не так?

$((By.className ("fileuploader-input"))).sendKeys ("/src/settings/files/test.jpg");

Элемент с [class="fileuploader-input"] является div.
В div нельзя (почти нельзя) отправлять send_keys.
Для загрузки файла вам нужно отправить его путь элементу input[type="file"].
В вашем случае, нужно «работать» с элементом input[type="file"][name="files[]"].

С помощью какого локатора мне искать?By.? (" ")

$(By.xpath ("//input[@type='file']")).sendKeys ("/src/settings/files/test.jpg");

Вот так?

list = os.listdir('c:\\Python37\\'+str(t)) 
self.driver.find_element_by_xpath('//*[@id="form-group-photo"]/div/div/div[4]/div/input').send_keys("C:\\Python37\\"+str(t)+"\\"+list[0])
	for i in list[1:]:
		try:
			self.driver.find_element_by_xpath('//*[@id="form-group-photo"]/div/div/div[3]/div/div/button').send_keys("C:\\Python37\\"+str(t)+"\\"+i)
		except NoSuchElementException:
			print('Фото не загрузились')

Такая беда: нужно загрузить несколько фото. Первое загружается нормально. А вот втрое и последующие с глюком.
Вместо просто второго загружается и первое и второе. Вместо просто третьего, загружаются первое, второе и третье.
Т.е. они получаются задублированы.

И дело, скорее всего, не в коде, а в особенностях сайта. Т.к. с помощью send_keys я передаю элементу абсолютный адрес, а когда делаю это второй раз, там все еще хранится первый. Как-то так.