English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
نحن نقدم لكم سابقًا طريقة اختبار WebDriver الخاصة بـ Selenium تعتمد على صفحة الويب. الأمثلة السابقة كانت تستخدم صفحات ويب بسيطة للتعامل، وقد لا تشعر بعملية تحميل الصفحة، ولكن في عملية التطبيق الفعلية، يستهلك تحميل الصفحة وقتًا معينًا. بدأ سكريبتك في التشغيل، ولكن العنصر الذي تريد تحديد موقعه لم يتم تحميله بعد، في هذه الحالة سيتم إصدار خطأ في عدم العثور على العنصر. من الواضح أن السكريبت التي لم تكن قد نظرت في وقت التحميل ليست سكريبت ناجحة. اليوم سنتحدث عن كيفية ضبط وقت الإنتظار.
ثلاث طرق للانتظار
time.sleep(n)
انتظار إجباري لمدة n ثانية. هي دالة من Python نفسها، تحتوي على حزمة time، يجب استيراد الحزمة قبل الاستخدام. تم استخدام هذا الانتظار في الأمثلة السابقة لسهولة رؤية نتائج تنفيذ السكربت، هذه الطريقة غير ذكية جدًا، حيث يجب الانتظار لمدة n ثانية مهما كان وقت تحميل الصفحة، مما يجعلها غير ذكية.
implicitly_wait(n)
انتظار أطول لمدة n ثانية، إذا تم تحميل الصفحة في غضون n ثانية، ينتهي الانتظار مبكراً. هذه هي طريقة الانتظار التي يقدمها WebDriver، وتسمى أيضًا الانتظار الخفي، وهي أكثر ذكاءً قليلاً من الانتظار الإجباري، ولكن إذا كان الموقع يحتوي على ملفات كبيرة مثل الفيديوهات، حتى لو كان العنصر المطلوب قد تم تحميله في البداية، يجب انتظار تحميل جميع الملفات قبل استمرار السكربت، مما يعتبر عيباً.
WebDriverWait(n)
انتظار أطول لمدة n ثانية، يتحقق من وجود العنصر المطلوب كل فترة من الزمن، إذا كان العنصر موجوداً، ينتهي الانتظار مبكراً. هذه هي طريقة الانتظار التي يقدمها WebDriver، وتسمى أيضًا الانتظار الموضعي، وهي أكثر ذكاءً من الانتظار الخفي، حيث لا يهتم بتحميل الصفحة بالكامل، فقط عندما يكون العنصر المطلوب موجوداً، ينتهي الانتظار.
مثال
تم استخدام الانتظار الإجباري في الأمثلة السابقة، لنرى طريقتي انتظار WebDriver
انتظار خفي
في الواقع، تم استخدام الانتظار الخفي في الشرح السابق، ولكن لم يتم ذكر الطريقة بشكل خاص. سنقوم في هذه المرة بفتح صفحة بداية وايه، وهي موقع ويب يحتوي على الكثير من المحتويات، وتبعاً لسرعة الاتصال، يمكن تقدير أن يستغرق حوالي 10 ثوانٍ لتحميلها تماماً، سنضبط وقت الانتظار إلى 60 ثانية، ثم نحسب مدة الحاجة إلى فتح الصفحة واستخدام زر التوجيه في صفحة【公开课】
# coding = utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(60) # وقت الانتظار الخفي 60 ثانية time_start = time.time() # تسجيل الوقت عند فتح الصفحة driver.get('https://www.163.com/') driver.find_element_by_id('js_love_url').click() time_end = time.time() # تسجيل الوقت عند الضغط على الزر print('access time is : ', time_end - time_start) # طباعة الفرق في الوقت، أي الوقت المستهلك الفعلي time.sleep(2) # ينتظر 2 ثوانٍ إجبارياً، لمراقبة ما إذا كاننا قد فتحنا صفحة【公开课】 driver.quit()
يظهر عند تنفيذ السكربت أنه على الرغم من أننا قمنا بضبط الوقت الخفي إلى 60 ثانية، إلا أن الصفحة قد تم تحميلها في حوالي 5 ثوانٍ (انظر النتيجة التنفيذية أدناه). يمكنني الضغط على زر【公开课】الآن. إليك نتيجة تنفيذي مرة واحدة، حيث يظهر وقت التحميل بالكامل.
>>>وقت الوصول هو: 5.717327117919922
الانتظار البديل
عند استخدامه الانتظار البديل يجب دائمًا استيراد كلاً من selenium.webdriver.support.wait.WebDriverWait، ويبدو API كالتالي:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
بما أن الانتظار البديل يتطلب التأكد من وجود العنصر، عادة ما يتم استخدامه مع الطرق التالية
until(method, message='') until_not(method, message='')
النقطة: يجب أن يكون method() قابلاً للتطبيق، ويجب أن يحتوي على طريقة __call__()، لنقم بإعادة كتابة المثال.
# coding = utf-8 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait import time driver = webdriver.Chrome() class button(): def __call__(self, driver): if driver.find_element_by_id('js_love_url'): return True else: return False driver.implicitly_wait(60) time_start = time.time() driver.get('https://www.163.com/') # driver.find_element_by_id('js_love_url').click() WebDriverWait(driver,2,0.5).until(button()) time_end = time.time() print('access time is : ', time_end - time_start) time.sleep(2) driver.quit()
بعد مشاهدة هذا المثال قد تكون لديك استفسارات، لماذا لم يتم عرض الخطأ عندما قمت بإعداد الانتظار الظاهري إلى 2 ثانية؟ لأننا قمنا أيضًا بإعداد وقت الانتظار الخفي، يتم أخذ أطول وقت انتظار كوقت انتظار فعلي، لذا في هذا المثال، وقت الانتظار هو 60 ثانية.
الخلاصة
1- Selenium يمكن أن يستخدم ثلاثة أنواع من الانتظار، الأكثر ذكاءً هو WebDriverWait()
2- عند وجود الانتظار الخفي والظاهري معًا، يُعتبر وقت الانتظار الأطول كوقت انتظار فعلي
3- في الانتظار الظاهري، method() هو دالة قابلة للإجراء، يمكن تعريفها بنفسك، أو يمكن استخدام طرق مثل الدوال المجهولة وما إلى ذلك، هذا سنتحدث عنه لاحقاً
4- إعداد الانتظار الخفي مرة واحدة، أي من البداية إلى النهاية للسكرين، يجب إعداد الانتظار الإجباري في كل مكان يجب الانتظار
هذا هو نهاية محتويات هذا المقال، نأمل أن تكون قد ساعدتكم في التعلم، ونأمل أن تدعموا تعليمات النطق.
بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر تخص المالك الأصلي، المحتويات تم تقديمها من قبل مستخدمي الإنترنت الذين قاموا بتحميلها، هذا الموقع لا يملك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فوراً.