দ্বিতীয় এবং তৃতীয় অংশে আমরা ওয়ার্কিং টেস্ট পেয়েছি, কিন্তু আমরা যদি টেস্ট রান করানোর আগে এটির স্টেট পুনসথাপন করতে চায় (যেমন ওপেন অ্যাপ কিল করা) তবে আমাদেরকে তা করতে হবে আবার নতুন করে করতে হবে। সেটা কিছুটা বিরক্তিকর, তাই এটিকে স্বনির্ভর করা দরকার! এই অংশে আমরা সেটিই করা দেখব এবং আরো দেখব আলাদা আলাদা পাইথন মেথডে কোডের বিট ব্রেক আউট করা, যা আমরা রিইউজ করতে পারি।
নিজে থেকে পুনঃস্থাপিত স্টেট
কোন টিপিক্যাল টেস্ট রানের আগে, আমাদের খুব সম্ভবত ফায়ারফক্স OS লক স্ক্রিন আনলক করে নেওয়া লাগবে এবং সব চলমান অ্যাপ কিল করতে হবে। এখন দেখা যাক এটি কীভাবে করা যায়।
লক স্ক্রিন আনলক করা
অন্য কোথাও যাওয়ার আগে, লক স্ক্রিন পুনরায় সক্রিয় করে নিনঃ সেটিং অ্যাপ > স্ক্রিন লক > লক স্ক্রিন , যদি আপনি তা না করে থাকেন।
নিচের পাইথন ম্যাথোডটি আপনার test_add_contact.py
ফাইলে সংযুক্ত করুন, ক্লাসের ভেতরেঃ
def unlock_screen(self): self.marionette.execute_script('window.wrappedJSObject.lockScreen.unlock();')
এখন, যখন কল করা হবে, এই ম্যাথোডটি ফায়ারফক্স OS আনলক করবে। এখন নিচের লাইনগুলো আমাদের কোডে self.marionette.start_session()
লাইনটির ঠিক নিচে যুক্ত করে এটিকে কল করা যাকঃ
# Unlock the screen self.unlock_screen()
কোন ওপেন অ্যাপ কিল করা
এখন আমরা কোড রান করানোর সময় অন্য সব ওপেন কোড কিল করার জন্য আমাদের কোডে একটি ম্যাথোড যুক্ত করব। সেটা এমন দেখাবেঃ
def kill_all(self): self.marionette.switch_to_frame() self.marionette.execute_async_script(""" // Kills all running apps, except the homescreen. function killAll() { let manager = window.wrappedJSObject.appWindowManager; let apps = manager.getApps(); for (let id in apps) { let origin = apps[id].origin; if (origin.indexOf('homescreen') == -1) { manager.kill(origin); } } }; killAll(); // return true so execute_async_script knows the script is complete marionetteScriptFinished(true); """)
সর্বশেষ অংশে যুক্ত unlock_screen
ম্যাথোডের ঠিক পরে এটি যুক্ত করুন।
তারপর, বাকি টেস্টের সাথে এটিকে রান করানোর জন্য নিচের ফাংশনটি যুক্ত করুন; self.unlock_screen()
এর ঠিক পরে যুক্ত করুনঃ
# kill all open apps self.kill_all()
এখন পুনরায় টেস্ট রান করানোর চেষ্টা করার আগে, শেষবার টেস্ট রান করানোর পর কন্ট্যাক্ট অ্যাপ ওপেন রেখে লক স্ক্রিনে ফিরে যাওয়ার চেষ্টা করুন। স্ক্রিন আনলক থাকার কারণে, টেস্ট পুনরায় রান করানর আগে, ওপেন কন্ট্যাক্ট অ্যাপ নিজে থেকেই কিল হয়ে যাবে, তাই এটির অবস্থা আপনার টেস্ট করানর প্রক্রিয়া ব্যাহত করবে না। আপনার টেস্ট রানের সুদূর নির্ভরতার জন্য এটি গুরুত্বপূর্ণ।
রানটি বেশ কয়েকবার রান করিয়ে দেখুন সব কিছু ঠিকঠাক মত কাজ করছে কিনা এবং ফায়ারফক্স ঠিক মত রিসেট করে নিন।
ডাইনামিক ওয়েটস্
তৃতীয় অংশে আমরা ডাইনামিক ওয়েটস্ এর গুরুত্ব উল্লেখ করেছি। ঠিক ওয়েব ড্রাইভার/ সেলেনিয়াম2 এর মত ম্যারিওনেটেরও এমন নিজস্ব সিনট্যাক্স আছেঃ
from marionette_driver import Wait # Wait until element is displayed Wait(self.marionette).until(lambda m: m.find_element('id', 'element_id').is_displayed())
যতক্ষণ না পর্যন্ত নির্ধারিত এলিমেন্টটি ডিসপ্লে হবে তখন পর্যন্ত এই কোডটি অপেক্ষা করবে। এবার আমরা জানি সেক্ষেত্রে আমাদের কী করতে হবে। এবার আমাদের টেস্টে এই কোড কন্সট্রাক্ট ব্যবহার করে দেখা যাক।
প্রথমত, আপনার বর্তমান ইম্পোরট লাইনের ঠিক নিচে ওয়েট ইম্পোরটটি যুক্ত করুনঃ
from marionette_driver import Wait
এখন আমরা কন্ট্যাক্ট আইকনে ট্যাপ করার পর ( self.marionette.switch_to_frame()
এর ঠিক পরে ) দ্বিতীয় time.sleep(2)ফাংশনটির পরিবর্তে
Wait()
ম্যাথোডটি লিখব। কন্ট্যাক্ট ফ্রেম ডিসপ্লে না হওয়া পর্যন্ত সেটি অপেক্ষা করবেঃ
Wait(self.marionette).until(lambda m: m.find_element('css selector', "iframe[data-url*='contacts']").is_displayed())
আমরা যখন কোন নতুন কন্ট্যান্ট অ্যাপ তৈরির জন্য + চিহ্নতে ট্যাপ করি, আমরা অ্যাড কন্টেন্ট এর জন্য অপেক্ষা করব যাতে ভিউটি সম্পূর্ণ সরে যায়।এবার আমরা যেটি ট্যাপ করব তা হল Done (সেভ) বাটন। তাই সেটি সঠিক স্থানে না আসা পর্যন্ত আমরা অপেক্ষা করব। তৃতীয় time.sleep(2)ফাংশনটি
র পরিবর্তে নিচেরটি লিখবঃ
Wait(self.marionette).until(lambda m: m.find_element('id', 'save-button').location['y']== 0)
এক্ষেত্রে আমরা Done বাটনটি স্ক্রিনের শীর্ষে দেখতে পাইয়া পর্যন্ত অপেক্ষা করব; প্রথমের দিকে এলিমেন্টটি স্ক্রিনের ভিন্ন ভিন্ন স্থানে দেখতে পাওয়া যাবে তবে চূড়ান্ত স্থায়ী অবস্থানের জন্য অপেক্ষা করাই শ্রেয়।
আমরা এলিমেন্টগুলোর *not* দৃশ্যমান হওয়ার জন্যও অপেক্ষা করতে পারি। Done ট্যাপ করার পর, not এর মত একই ধরণের Wait()ম্যাথোড ব্যবহার করে
Done বাটনটি অদৃশ্য হওয়ার জন্য অপেক্ষা করব, বাকি কোড রান করানোর আগে। চতুর্থ এবং সর্বশেষ time.sleep(2)
ফাংশনটির পরিবর্তে নিচেরটি লিখুনঃ
Wait(self.marionette).until(lambda m: not m.find_element('id', 'save-button').is_displayed())
আপনার টেস্ট যদি ঠিক মত রান করতে থাকে তাহলে তো দারুণ! আমরা আমাদের টেস্টকে আরো বেশি মডুলার এবং নির্ভরযোগ্য করে ফেলেছি। পঞ্চম অংশে আমরা টেস্ট রানার ব্যবহারের সাথে পরিচিত হব।