Selenium RC › как загрузить файл с помощью attachFile()

Я использую 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 нужно указать здесь. Пожалуйста, дайте мне пример, если это возможно.


person Saara    schedule 10.11.2009    source источник
comment
кто-нибудь там, чтобы ответить на этот запрос??? плиз помогите мне...   -  person Saara    schedule 25.11.2009


Ответы (8)


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

    //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 для выполнения дополнительных действий. Оба они не требуют модификации браузера.

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

person Gus    schedule 18.06.2010

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

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

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

Затем, если ваш входной файл C:\tools\File.txt, вам нужно ввести следующие буквы:

селен.keyDownNative("16"); // ВКЛЮЧИТЬ

селен.keyPressNative("67"); // сдвиг c делает его C

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

селен.keyUpNative("16"); // ВЫКЛЮЧИТЬ

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

селен.keyPressNative("84"); // т

селен.keyPressNative("79"); // о

селен.keyPressNative("79"); // о

селен.keyPressNative("76"); // л

селен.keyPressNative("83"); // с

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

селен.keyDownNative("16"); // ВКЛЮЧИТЬ

селен.keyPressNative("70"); // сдвиг f делает его F

селен.keyUpNative("16"); // ВЫКЛЮЧИТЬ

селен.keyPressNative("73"); // я

селен.keyPressNative("76"); // л

селен.keyPressNative("69"); // е

селен.keyPressNative("46"); // .

селен.keyPressNative("84"); // т

селен.keyPressNative("88"); // Икс

селен.keyPressNative("84"); // т

селен.keyPressNative("10"); // Войти

selenium.keyReleaseNative("10"); // Войти

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

person Saara    schedule 30.11.2009
comment
\ называется антислэш, а не слэш. и ваш метод не работает со всеми клавиатурами, всеми типами текста и всеми операционными системами. - person Pierre Gardin; 06.08.2010
comment
@PierreGardin а) Это называется антислэшем только по-французски, по-английски это обратная косая черта б) Это коды клавиш Java, поэтому они будут работать независимо от того, какую клавиатуру вы подключили. в) Вы правы, это не сработает со всеми операционными системами, но ни один из них не вводит путь в виде строки — предположения должны быть сделаны в любом случае. Это хороший обходной путь - person Abe Fehr; 07.06.2016

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

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

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

Например: attachFile("uploadField", Thread.currentThread().getContextClassLoader().getResource("files/sample.pdf").toString());

person joe-mojo    schedule 30.11.2009
comment
На самом деле мое приложение не поддерживает firefox... поэтому этот метод attachFile у меня не работал... а методы keyPressNative/keyReleaseNative работают с IE7... - person Saara; 01.12.2009
comment
Я думаю, что это наоборот. - person hoymkot; 23.02.2012

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

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

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

person Sebastien B.    schedule 25.01.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 «идентификатор вашей кнопки обзора». Когда окно просмотра открывается на компьютере с Windows, AutoIt автоматически заполняет текстовое поле, и оно закрывается. Надеюсь, это поможет кому-то, потому что это сводило меня с ума.

person Bill Sloane    schedule 18.05.2011

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

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

Также важно запустить кнопку загрузки файла в отдельном потоке.

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

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

Сценарий:

$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
person moonio    schedule 28.10.2011

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

http://bitsilearn.blogspot.com/

person shadeslayer    schedule 21.03.2010

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

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

$browser.click "css=input.file" # This is the 'Choose File' button
$browser.type "css=input.file", "/absolute/path/to/file.file"
person Huliax    schedule 17.02.2012