2009-11-10 7 views
8

Я использую Selenium RC с рамкой Junit. Я пытаюсь загрузить файл с помощью метода attachFile().Selenium RC> как загрузить файл с помощью 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-адрес указывается здесь. Пожалуйста, дайте мне пример, если это возможно.

+0

никого там, чтобы ответить на этот вопрос ??? PLZ помочь мне ... – Saara

ответ

1

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

Вам нужно будет передать фокус в текстовое поле с помощью:

selenium.focus («текстовое поле локатора»);

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

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

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

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

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

selenium.keyPressNative ("47"); // slash

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

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

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

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

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

selenium.keyPressNative ("47"); // slash

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

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

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

selenium.keyPressNative ("73"); // i

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

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

selenium.keyPressNative ("46"); //.

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

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

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

селен.keyPressNative ("10"); // Ввод

selenium.keyReleaseNative ("10"); // Enter

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

+0

\ называется антиспашем, а не слэш. и ваш метод не работает со всеми клавиатурами, всеми типами текста и всеми ОС. –

+0

@PierreGardin a) Это только называется antislash на французском, на английском - это обратная косая черта. B) Это Java KeyCodes, поэтому они будут работать независимо от того, какая клавиатура вы подключили. C) Вы правы, что это не будет работать со всеми ОС, но и не вводить путь в виде строки - предположения должны быть сделаны в любом случае. Это приятное обходное решение –

1

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

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

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

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

+0

На самом деле мое приложение не поддерживает firefox ... так что этот метод attachFile не работал для меня ... и keyPressNative/keyReleaseNative методы работают с IE7 ... – Saara

+0

Я думаю, что это наоборот. – hoymkot

4

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

//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"); 
    } 

браузер это просто переменная, содержащая какой браузер скрипт Селен работает и код, очевидно, в 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, который поддерживается автоматической библиотекой _IE, не сможет справиться с этим.

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

Приносим извинения за недостаток комментариев, этот код по-прежнему выполняется.

+0

спасибо за возвращение и добавление вашего решения! –

+0

+1 - работает и для хрома –

1

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

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

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

1

Использование Selenium/Rspec/Internet Explorer Мое решение было создать сценарий AutoIt на моем окна машины

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

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

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

1

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

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

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

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

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

Скрипт:

$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 
0

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

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

$browser.click "css=input.file" # This is the 'Choose File' button 
$browser.type "css=input.file", "/absolute/path/to/file.file" 
Смежные вопросы