আমি একটি কৌণিকর e2e পরীক্ষা ব্যবহার করে ফাইল আপলোড পরীক্ষা করতে চাই। আপনি e2e পরীক্ষায় এটি কীভাবে করেন? আমি আমার পরীক্ষা স্ক্রিপ্ট গ্রান্ট কর্মের মাধ্যমে চালিত করি।
উত্তর:
আমি এটি এইভাবে করি:
var path = require('path');
it('should upload a file', function() {
var fileToUpload = '../some/path/foo.txt',
absolutePath = path.resolve(__dirname, fileToUpload);
element(by.css('input[type="file"]')).sendKeys(absolutePath);
element(by.id('uploadButton')).click();
});
path
আপনি যে ফাইলটি আপলোড করতে চান তার পুরো পথটি সমাধান করতে মডিউলটি ব্যবহার করুন ।এটি ফায়ার ফক্সে কাজ করবে না। প্রটেক্টর অভিযোগ করবে কারণ উপাদানটি দৃশ্যমান নয়। ফায়ারফক্সে আপলোড করতে আপনার ইনপুটটি দৃশ্যমান করতে হবে। এই আমি কি কি:
browser.executeAsyncScript(function(callback) {
// You can use any other selector
document.querySelectorAll('#input-file-element')[0]
.style.display = 'inline';
callback();
});
// Now you can upload.
$('input[type="file"]').sendKeys(absolutePath);
$('#uploadButton').click();
__dirname
কখনও কখনও অস্থায়ী ডিরেক্টরিতে নির্দেশ করে (সম্ভবত যেখানে পরীক্ষাগুলি রানার দ্বারা অনুলিপি করা হয়)। যদি এটি process.cwd()
হয় __dirname
তবে আপনি তার পরিবর্তে ব্যবহার করতে পারেন ।
আপনি সরাসরি পারবেন না।
সুরক্ষার কারণে আপনি এমন কোনও ব্যবহারকারীকে অনুকরণ করতে পারবেন না যে এনজিএসনারিওর মতো কার্যক্ষম পরীক্ষার স্যুটে সিস্টেমে কোনও ফাইল বেছে নিচ্ছে।
প্রটেক্টর দিয়ে, যেহেতু এটি ওয়েবড্রাইভারের উপর ভিত্তি করে, তাই এই কৌশলটি ব্যবহার করা উচিত
প্রশ্ন: ওয়েবড্রাইভার ফাইল আপলোড সমর্থন করে? উত্তর: হ্যাঁ
আপনি নেটিভ ওএস ফাইল ব্রাউজার ডায়ালগের সাথে সরাসরি ইন্টারঅ্যাক্ট করতে পারবেন না, তবে আমরা কিছু ম্যাজিক করি যাতে আপনি যদি কোনও ফাইল আপলোড উপাদানগুলিতে ওয়েবইলেমেন্ট # সেন্ডকিজ ("/ পাথ / টু / ফাইল") কল করেন তবে এটি সঠিক কাজ করবে। নিশ্চিত হয়ে নিন যে আপনি ওয়েবএলিমেন্টটি # ফাইল ক্লিক করেন না () ফাইল আপলোড উপাদান, বা ব্রাউজার সম্ভবত ঝুলবে।
এটি ঠিক কাজ করে:
$('input[type="file"]').sendKeys("/file/path")
এন্ড্রেস ডি এবং ডেভিডবি 583 এর পরামর্শের একটি কম্বো এখানে দেওয়া হয়েছে যা এর মাধ্যমে কাজ করার সাথে সাথে আমাকে সহায়তা করত ...
আমি প্রবাহের নিয়ন্ত্রণগুলির বিরুদ্ধে চালিত প্রোটেক্টর পরীক্ষা পাওয়ার চেষ্টা করছিলাম।
// requires an absolute path
var fileToUpload = './testPackages/' + packageName + '/' + fileName;
var absolutePath = path.resolve(__dirname, fileToUpload);
// Find the file input element
var fileElem = element(by.css('input[type="file"]'));
// Need to unhide flowjs's secret file uploader
browser.executeScript(
"arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1",
fileElem.getWebElement());
// Sending the keystrokes will ultimately submit the request. No need to simulate the click
fileElem.sendKeys(absolutePath);
// Not sure how to wait for the upload and response to return first
// I need this since I have a test that looks at the results after upload
// ... there is probably a better way to do this, but I punted
browser.sleep(1000);
ফায়ারফক্সে ফাইল আপলোড করতে আমি এটিই করি, এই স্ক্রিপ্টটি উপাদানটিকে পথের মান নির্ধারণ করার জন্য দৃশ্যমান করে:
browser.executeScript("$('input[type=\"file\"]').parent().css('visibility', 'visible').css('height', 1).css('width', 1).css('overflow', 'visible')");
আমি বুঝতে পারি যে আমি যে ওয়েব অ্যাপ্লিকেশনটির পরীক্ষা করছি সেটিতে ফাইল ইনপুটটি ফায়ারফক্সে কেবল তখনই দৃশ্যমান যখন এটি জাভাস্ক্রিপ্ট ব্যবহার করে দেখার জন্য স্ক্রোল করা হয়, তাই আমি আমার অ্যাপ্লিকেশনটির জন্য এটির কাজ করতে এন্ড্রেস ডি এর কোডটিতে স্ক্রোলইন্টোভিউ () যুক্ত করেছি:
browser.executeAsyncScript(function (callback) {
document.querySelectorAll('input')[2]
.style = '';
document.querySelectorAll('input')[2].scrollIntoView();
callback();
});
(আমি ফাইল ইনপুট উপাদানগুলির জন্য সমস্ত শৈলীও সরিয়েছি)
// সি থেকে ফাইল আপলোড করতে: ory ডিরেক্টরি
{
var path = require('path');
var dirname = 'C:/';
var fileToUpload = '../filename.txt';
var absolutePath = path.resolve('C:\filename.txt');
var fileElem = ptor.element.all(protractor.By.css('input[type="file"]'));
fileElem.sendKeys(absolutePath);
cb();
};
fileToUpload
জন্য?
আপনি যদি নীচের পপআপটি না খোলার মাধ্যমে কোনও ফাইল নির্বাচন করতে চান তবে উত্তরটি হ'ল:
var path = require('path');
var remote = require('../../node_modules/selenium-webdriver/remote');
browser.setFileDetector(new remote.FileDetector());
var fileToUpload = './resume.docx';
var absolutePath = path.resolve(process.cwd() + fileToUpload);
element(by.css('input[type="file"]')).sendKeys(absolutePath);
যদি ব্যবহারকারীরা jQuery লোড করে থাকে তবে বর্তমান নথিভুক্ত সমাধানগুলি কাজ করবে। আমি সমস্ত বিভিন্ন পরিস্থিতিতে ব্যবহারকারীর ত্রুটি পাবেন যেমন: ব্যর্থ: defined সংজ্ঞায়িত নয়
আমি নেটিভ কৌণিক কোড ব্যবহার করে একটি সমাধান ডকুমেন্ট করার পরামর্শ দেব।
যেমন আমি পরামর্শ দেওয়ার পরিবর্তে পরামর্শ দেব:
$('input[type="file"]') .....
সুপারিশ:
angular.element(document.querySelector('input[type="file"]')) .....
পরেরটি আরও স্ট্যান্ডার্ড, কৌণিকের উপরে এবং আরও গুরুত্বপূর্ণ jquery প্রয়োজন হয় না