English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

كيفية ضبط وقت الانتظار في selenium باللغة Python

نحن نقدم لكم سابقًا طريقة اختبار 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)
  • driver: لا تحتاج إلى التوضيح، هو متصفح WebDriver الذي قمت بتعريفه (Chrome،Firefox، إلخ)
  • timeout: وقت الانتظار الأقصى، وحدة القياس هي ثانية
  • poll_frequency: زمن البحث عن العنصر بين التحققات، القيمة الافتراضية هي 0.5 ثانية (بدون تحديد فهي 0.5 ثانية)، مما يعني أن يتم التحقق من وجود العنصر كل 0.5 ثانية، إذا تم العثور عليه، يتم إنهاء الانتظار البديل، وإلا يتم المتابعة في الانتظار لمدة 0.5 ثانية قبل البحث مرة أخرى
  • ignored_exceptions=None: معلومات استثناء الزمني، القيمة الافتراضية هي NoSuchElementException

بما أن الانتظار البديل يتطلب التأكد من وجود العنصر، عادة ما يتم استخدامه مع الطرق التالية

until(method, message='')
until_not(method, message='')
  • method: تعني method في until() طريقة تقديم طريقة قدمتها وحدة التحكم، حتى تُرجع not False، و until_not() هو حتى تُرجع False
  • 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 (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فوراً.

أفضل العروض لك