как selenium webdriver загружает файлы в браузер?

Я разработчик javascript / java, и я пытался выяснить, как Selenium WebDriver automation framework загружает файлы из файловой системы. Невозможно установить ввод файла через javascript, потому что это нарушение безопасности. Тем не менее, как-то webdriver может сделать это со следующей командой:

driver.setFileDetector(new LocalFileDetector());
WebElement upload = driver.findElement(By.id("myfile"));
upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg");
driver.findElement(By.id("submit")).click();

таким образом, они устанавливают значение, отправляя ключи к нему? Я не понимаю. Я просмотрел исходный код, найденный здесь: http://code.google.com/p/selenium/source/checkout Я до сих пор не могу найти, где они это делают.

Edit: мой вопрос не в том, как это сделать с selenium, но как разработчики selenium сделали это возможным? Как они обходили ограничения безопасности в javascript? Как они загружают файл?

6 ответов


хороший вопрос дружище...они написали HTTP-прокси для решения ограничений безопасности Javascript. Использование этого прокси-сервера позволило обойти многие ограничения политики" тот же источник хоста", где браузер не позволяет Javascript совершать вызовы ни к чему, кроме сервера, с которого была подана текущая страница.

кроме того, WebDriver использует альтернативный подход запуска событий на уровне ОС. Поскольку эти "собственные события" не генерируются браузер этот подход обходит ограничения безопасности, установленные для синтезированных событий, и, поскольку они специфичны для ОС, когда они работают для одного браузера на определенной платформе, повторное использование кода в другом браузере относительно легко.

большая часть содержимого выше ссылается на ниже..прочитайте следующую ссылку для получения более подробной информации о Selenium internals

http://www.aosabook.org/en/selenium.html


функция загрузки файлов windowns HTML-коды:

<input id="fileField" type="file" onchange="document.getElementById('textfield').value=this.value" name="position">   

<input type="submit" value="导入">

вы можете использовать следующие коды для завершения загрузки файла windows. Он работает успешно, и коды не включают нажатие действия загрузки.

driver.FileDetector = new LocalFileDetector();
FindElement(By.Id("fileField")).SendKeys(@"C:\Users\admin\Desktop\ProfessionCodes.txt"); FindElement(By.CssSelector("input[type='submit']")).Click();

Я загружено фото на Facebook с помощью Selenium Webdriver и AutoIt

шаги, как показано ниже

Шаг 1

на eclipse код до (загрузить фотографию), как показано ниже:

WebElement Upload = Firefox.findElement(By.cssSelector("input[id^='u_']"));
Upload.click();

Шаг 2

загружено и установлено AutoIt:http://www.autoitscript.com/site/autoit/downloads/ (скачать ZIP)

Шаг 3

написать код, как ниже в блокноте и сохранил его как PhotoUpload.au3

WinWaitActive("File Upload")
Send("D:\Photo0116.jpg")   
Send("{ENTER}")

Шаг 4: щелкните правой кнопкой мыши на этом .файл au3 и скомпилируйте его.

Шаг 5: добавьте код в файл скрипта, как показано ниже:

try {
    String[] commands = new String[]{};
    // Location of the autoit executable
    commands = new String[] {"D:\My softwares\install software\selenium\UploadPhoto3.exe"};
    Runtime.getRuntime().exec(commands);
}       
catch (IOException e) {}

Шаг 6: запуск скрипта (PhotoUpload.java)

Шаг 7: фото успешно загружены.


  //assuming driver is a healthy WebDriver instance
    WebElement fileInput = driver.findElement(By.name("uploadfile"));
   fileInput.sendKeys("C:/path/to/file.jpg");

или

 driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");

попробуйте это и дайте мне знать


в некоторых случаях специально с Java вам нужно создать объект файла и передать absolutePath () драйверу, например:

File file = new File(sampleFile);
driver.findElement(By.id("<Your input tag with type of File>")).sendKeys(file.getAbsolutePath());

пример файла-это строка, указывающая на файл, который необходимо загрузить. Это работает для меня в Firefox и Chrome.


это помогло мне сделать загрузку файла,

код :

 public class FileUpload {
        @Test
        public void test() {
            WebDriver driver = new FirefoxDriver();
            driver.get("http://www.freepdfconvert.com/pdf-word");
            driver.findElement(By.id("clientUpload")).click();
            driver.switchTo()
                    .activeElement()
                    .sendKeys(
                            "/home/likewise-open/GLOBAL/123/Documents/filename.txt");
            driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
            driver.findElement(By.id("convertButton"));
            /*
             * driver.switchTo().activeElement()
             * .sendKeys("selenium_2_testing_tools.pdf"); ;
             */
         {
                driver.wait(30000);
            } catch (Exception er) {
                System.out.println(er);
            }

        }
    }