Selenium webdriver를 사용하여 파일 끌어서 놓기를 시뮬레이트하는 RSpec 테스트를 게시합니다. jQuery를 사용하여 가짜 'drop'이벤트를 만들고 트리거합니다.
이 코드는 단일 파일의 끌어서 놓기를 시뮬레이션합니다. 간단하게하기 위해 여러 파일을 삭제할 수있는 코드를 제거했습니다. 필요하면 말해줘.
describe "when user drop files", :js => true do
before do
page.execute_script("seleniumUpload = window.$('<input/>').attr({id: 'seleniumUpload', type:'file'}).appendTo('body');")
attach_file('seleniumUpload', Rails.root + 'spec/support/pdffile/pdfTest.pdf')
# Trigger the drop event
page.execute_script("e = $.Event('drop'); e.originalEvent = {dataTransfer : { files : seleniumUpload.get(0).files } }; $('#fileDropArea').trigger(e);")
end
it "should ..." do
should have_content '...'
end
P.S :은 드롭 영역의 ID와 #fileDropArea를 교체해야합니다.
P.P.S : 복잡한의 jQuery 객체를 평가하고, 그렇지 않으면 셀레늄 집착, execute_script 대신에 evaluate_script 사용하지 마십시오!
UPDATE : 난 당신이 다시 이상 쓸 물건을 할 수있는 방법을 쓰기했습니다.
def drop_files files, drop_area_id
js_script = "fileList = Array();"
files.count.times do |i|
# Generate a fake input selector
page.execute_script("if ($('#seleniumUpload#{i}').length == 0) { seleniumUpload#{i} = window.$('<input/>').attr({id: 'seleniumUpload#{i}', type:'file'}).appendTo('body'); }")
# Attach file to the fake input selector through Capybara
attach_file("seleniumUpload#{i}", files[i])
# Build up the fake js event
js_script = "#{js_script} fileList.push(seleniumUpload#{i}.get(0).files[0]);"
end
# Trigger the fake drop event
page.execute_script("#{js_script} e = $.Event('drop'); e.originalEvent = {dataTransfer : { files : fileList } }; $('##{drop_area_id}').trigger(e);")
end
사용법 :
describe "when user drop files", :js => true do
before do
files = [ Rails.root + 'spec/support/pdffile/pdfTest1.pdf',
Rails.root + 'spec/support/pdffile/pdfTest2.pdf',
Rails.root + 'spec/support/pdffile/pdfTest3.pdf' ]
drop_files files, 'fileDropArea'
end
it "should ..." do
should have_content '...'
end
end
나는 그것이 일할 수 있더라도 그것이 옵션 일 수있는 것처럼 보입니다. OSX에서는 Windows가 아니라 g. 또한 JavaScriptbot과 상호 작용하고 JavaScript 컨텍스트에서 이벤트를 발생시키는 것에 대해 기술적으로 궁금합니다. –