Selenium RC> как загрузить файл с помощью attachFile () - PullRequest
8 голосов
/ 10 ноября 2009

Я использую Selenium RC с фреймворком Junit. Я пытаюсь загрузить файл, используя метод attachFile ().

attachFile: (Information collected from selenium API http://release.seleniumhq.org/selenium-remote-control/1.0-beta-2/doc/java/com/thoughtworks/selenium/Selenium.html#attachFile(java.lang.String,%20java.lang.String))

void attachFile(java.lang.String fieldLocator,
            java.lang.String fileLocator)

Sets a file input (upload) field to the file listed in fileLocator

Parameters:
    fieldLocator - an element locator
    fileLocator - a URL pointing to the specified file. Before the file can be set
  in the input field (fieldLocator), Selenium RC may need to transfer the file to 
  the local machine before attaching the file in a web page form. This is common in 
  selenium grid configurations where the RC server driving the browser is not the 
  same machine that started the test. Supported Browsers: Firefox ("*chrome") only.

Может кто-нибудь сказать, пожалуйста, как определить "fileLocator" . Я не получаю, какой URL указывать здесь. Пожалуйста, дайте мне пример, если это возможно.

Ответы [ 8 ]

4 голосов
/ 18 июня 2010

Это старый вопрос, но я недавно решил проблему, делая это

    //Start an auto it script that selects the file manually
    if(browser.contains("iexplore")){
        Runtime r= Runtime.getRuntime();
        Process p = null;
        try {
            p = r.exec("C:\\uploadFile.exe  \"Files\" \"ctl00$ContentPlaceHolder1$FilesView$ctl02$NewFile\" \"C:\\GhostTagBug2.ttx\"");

        }catch(Exception e){}
        p.waitFor();
    } else {
        //Tested on firefox
        //Get focus and type the path manually
        selenium.focus("xpath=//input[contains(@id,\"_NewFile\")]");
        selenium.type("xpath=//input[contains(@id,\"_NewFile\")]", "C:\\GhostTagBug2.ttx");
    }

browser - это просто переменная, в которой указывается, в каком браузере запущен скрипт Selenium, а код явно в java.

Для IE uploadFile.exe - это сценарий автоматического запуска, который выглядит следующим образом.


#include IE.au3
AutoItSetOption("WinTitleMatchMode","2") ; set the select mode to select using substring

;Normally run from command line
if($cmdLine[0] > 2) then 
    $titlex = $cmdLine[1] ;Title of the window
    $form = $cmdLine[2] ;Name of the file upload/save form object
    $file = $cmdLine[3] ;Path of the file to upload
Else
    ;Testing fields
    $titlex = "Files"
    $form = "ctl00$ContentPlaceHolder1$FilesView$ctl02$NewFile"
    $file = "C:\\GhostTagBug2.ttx"
EndIf

WinWait($titlex) ; match the window with substring
$title = WinGetTitle($titlex) ; retrives whole window title
WinSetState($title, "", @SW_MAXIMIZE) ;Maximize the window incase button is hidden
WinActivate($title)
WinWaitActive($title)

$oIE = _IEAttach ("Files")
$oT = _IEGetObjByName ($oIE, $form)
;Move the mouse to the button on the form and click it
MouseMove (_IEPropertyGet ($oT, "screenx") + _IEPropertyGet ($oT, "width") - 10, _IEPropertyGet ($oT, "screeny") + _IEPropertyGet ($oT, "height") / 2)
MouseClick ("left")

;Wait for upload screen then input the file and close it
WinWait ("Choose File to Upload")
$hChoose = WinGetHandle ("Choose File to Upload")
ControlSetText ($hChoose, "", "Edit1", $file)
ControlClick ($hChoose, "", "Button2")

;Restore window state
WinSetState($title, "", @SW_RESTORE)

Он по существу захватывает заголовок окна, максимизирует его, вводит файл для загрузки, нажимает кнопку выбора и возвращается в Selenium, я хорошо его протестировал в IE 8, но не понимаю, почему IE, поддерживаемый auto, это _IE библиотека не сможет с этим справиться.

Я видел много скриптов роботов и взломов Firefox, где вы позволяете JavaScript делать дополнительные вещи. Оба из них не требуют модификации браузера.

Я прошу прощения за отсутствие комментариев, этот код все еще в разработке.

1 голос
/ 28 октября 2011

Вы можете попробовать этот скрипт в AutoIt. В основном, это ждет окна выбора файла. Затем вводит путь к файлу и отправляет ввод быстро. В конце проверяется, было ли какое-либо всплывающее сообщение об ошибке, если оно читается, текст и установите код выхода равным 1, если не установлен код выхода равным 0. Сценарий также обеспечивает закрытие окна выбора файла.

Скрипт может быть преобразован в исполняемый файл (.exe) с помощью Aut2Exe - важно отметить консоль? checkbox, после этого exe может и исполняется из java (Runtime.getRuntime().exec()).

Есть также одна важная вещь, которую нужно выполнить, нажав на кнопку загрузки файла в отдельной ветке.

new Thread() {
  public voi run() {
    browser.click([LOCALTOR]).
 }
}.start();

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

Сценарий:

$title="Choose File to Upload"
If($cmdLine[0] == 1 OR $cmdLine[0] == 2) Then
    $file=$cmdLine[1]
    If ($cmdLine[0] == 2) Then
        $title=$cmdLine[0]
    EndIf
Else
    ConsoleWriteError("Wrong number of argument. Use 2 argument: [FILE PATH] [FILE UPLOAD WINDOW TITLE]. Second argument is optional")
    Exit(-1)    
EndIf


If WinWaitActive($title,"",5)==0 Then ; wait 5 sec. 
    ConsoleWriteError($title & " window wasn't opened")
    Exit (2)
EndIf

Send($file)
Send("{ENTER}")

$status=WinWaitActive($title, "", 1)
$success = ($status = 0)

If Not $success Then
    $text =  ControlGetText($title,"","[CLASS:Static; INSTANCE:2]")
    WinClose($title)    
    WinClose($title)    
    ConsoleWriteError($text)
EndIf

Exit Not $success
1 голос
/ 18 мая 2011

Использование Selenium / Rspec / Internet Explorer Мое решение состояло в том, чтобы создать скрипт AutoIt на моем компьютере с Windows

WinWaitActive("Choose File to Upload")
Send("c:\tests\school.jpg")
Send("{ENTER}")
run("selectfile2.exe")

Затем запустите это как администратор на машине с Windows. Щелкните правой кнопкой мыши на исполняемый файл и запустите от имени администратора.

Затем rspec делает page.click «id вашей кнопки просмотра». Когда окно просмотра открывается на компьютере с Windows, AutoIt автоматически заполняет текстовое поле и закрывается. Надеется, что это кому-то поможет, потому что это сводило меня с ума.

1 голос
/ 25 января 2011

Мое решение - использовать Selenium-2 в режиме эмуляции RC. Это позволяет сохранить прежние тесты Selenium-1, но при необходимости переключиться на API Selenium-2 для выполнения таких задач, как загрузка файлов.

Селен-2 в настоящее время находится в бета-версии, но, похоже, относительно стабилен. Но не все, что может сделать Selenium-1, поддерживается режимом эмуляции Selenium-2 RC, поэтому подумайте дважды, прежде чем идти по этому пути.

Подробнее об этом здесь: http://seleniumhq.org/docs/09_webdriver.html#emulating-selenium-rc

1 голос
/ 30 ноября 2009

«fileLocator» - это не url, а локатор, как указано в верхней части javadoc класса Selenium. Это локатор ввода, используемый для выбора файла.

«fieldLocator» - это URL, указывающий на файл, который вы хотите установить в поле ввода формы, как указано в цитируемом документе.

В Firefox в режиме chrome (browserId = * chrome вместо * firefox) это работает должным образом. Документально подтверждено, что он работает только с этим browserId)

Например: attachFile ("uploadField", Thread.currentThread (). GetContextClassLoader (). GetResource ("files / sample.pdf"). ToString ());

1 голос
/ 30 ноября 2009

Я получил решение для этого, используйте метод selenium.focus и методы selenium.keyPressNative / keyReleaseNative.

Вам нужно будет выделить текстовое поле, используя:

selenium.focus ("локатор текстового поля");

Тогда, если ваш входной файл - C: \ tools \ File.txt, вам нужно напечатать буквы так:

selenium.keyDownNative ( "16"); // SHIFT ON

selenium.keyPressNative ( "67"); // c shift делает это C

selenium.keyPressNative ( "59"); //; Shift делает это: (вы не можете использовать двоеточие напрямую)

selenium.keyUpNative ( "16"); // SHIFT OFF

selenium.keyPressNative ( "47"); // косая черта

selenium.keyPressNative ( "84"); // t

selenium.keyPressNative ( "79"); // o

* * 1 022 selenium.keyPressNative ( "79"); // o

selenium.keyPressNative ( "76"); // l

selenium.keyPressNative ( "83"); // s

* * Selenium.keyPressNative тысячи двадцать восемь ( "47"); // косая черта

selenium.keyDownNative ( "16"); // SHIFT ON

selenium.keyPressNative ( "70"); // f shift делает это F

* 1 034 * selenium.keyUpNative ( "16"); // SHIFT OFF * +1036 * selenium.keyPressNative ( "73"); // я * * Selenium.keyPressNative одна тысяча тридцать восемь ( "76"); // l

selenium.keyPressNative ( "69"); // e

* * 1 042 selenium.keyPressNative ( "46"); //.

selenium.keyPressNative ( "84"); // t

selenium.keyPressNative ( "88"); // x

selenium.keyPressNative ( "84"); // t

selenium.keyPressNative ( "10"); // Введите

selenium.keyReleaseNative ( "10"); // Введите

Я закончил последовательность символом «Enter». Иногда это не работает, поэтому вам, возможно, придется нажать кнопку (если вы знаете, для чего это локатор элементов).

0 голосов
/ 18 февраля 2012

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

Я использую Ruby-клиент, так что это было что-то вроде этого, чтобы заставить его работать

$browser.click "css=input.file" # This is the 'Choose File' button
$browser.type "css=input.file", "/absolute/path/to/file.file"
0 голосов
/ 21 марта 2010

Намного проще использовать $ sel-> type и $ sel-> focus. Ниже хорошая статья.

http://bitsilearn.blogspot.com/

...