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

شرح تفصيلي لثلاث طرق للانتظار في selenium (مهمة لمعرفة)

العديد من الأشخاص يسألون في المجموعات، لا يمكن تحديد هذا القائمة المنسدلة أو ذلك النافذة المنبثقة... لا يمكن تحديد كل نوع من التحديد، في الواقع، في معظم الحالات هناك اثنين من المشاكل: 1 هناك قالب، 2 لم يتم إضافة الانتظار. لا يدركون أن سرعة تنفيذ كودهم هي ما مدى، وسرعة تحميل وتعديل متصفح الويب هي ما مدى، مثل أن يقول اللاعب السريع واللاعب البطيء لهم أن يذهبوا إلى قتال الأعداء، وبعد أن يكمل اللاعب السريع قتاله يعود ويقول لللاعب البطيء لماذا لا تزال ترتدي حذائك لمغادرة المنزل؟ يمر اللاعب البطيء بمشاعر لا تعد ولا تحصى في داخله، يعتقد أن اللاعب السريع ينتقده بسبب سرعته البطيئة، ويقرر أن لا يلعب معه ويطلق استثناءً ويترك المهمة.

إذن كيف يمكننا مراعاة سرعة التحميل البطيئة لللاعب البطيء؟ هناك طريقة واحدة فقط، وهي الانتظار. عندما نتحدث عن الانتظار، هناك ثلاث طرق للانتظار، وسأسردها لك جميعًا:

1. الانتظار القسري

الطريقة الأولى والأبسط والأكثر عنفاً هي الانتظار القسري sleep(xx)، حيث يجبر اللاعب السريع على الانتظار xx ثانية، بغض النظر عما إذا كان اللاعب البطيء يتبع السرعة أم كان قد وصل مسبقًا، يجب أن ينتظر xx ثانية.

أنظر إلى الكود:

# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io')
sleep(3) # الانتظار القسري لثلاث ثواني قبل تنفيذ الخطوة التالية
print driver.current_url
driver.quit()

هذا يسمى الانتظار القسري، لا يهم ما إذا كان متصفح الويب قد تم تحميله أم لا، يجب على البرنامج الانتظار لثلاث ثواني، عند انتهاء الثلاث ثواني، استمر في تنفيذ الكود التالي، يمكن أن يكون مفيدًا جدًا كطريقة للتجربة، ويمكن أيضًا استخدام هذا الانتظار في الكود، ولكن لا ينصح باستخدام هذا النوع من الطريقة دائمًا، لأنها قاسية جدًا ويمكن أن تؤثر بشكل كبير على سرعة تنفيذ البرنامج.

2. الانتظار الخفي

الطريقة الثانية تسمى الانتظار الخفي، implicitly_wait(xx)، معنى الانتظار الخفي هو: وافق اللاعب السريع واللاعب البطيء على الانتظار xx ثانية، إذا جاء اللاعب البطيء في هذا الوقت، فإنهما يغادران على الفور للذهاب إلى قتال الأعداء، وإذا لم يأت اللاعب البطيء في الوقت المحدد، فإن اللاعب السريع يذهب بنفسه، وبالتالي ينتظر اللاعب البطيء ليطلق استثناءً ويترك المهمة.

أنظر إلى الكود:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # الانتظار الخفي، أقصى وقت انتظار 30 ثانية
driver.get('https://huilansame.github.io')
print driver.current_url
driver.quit()

الانتظار الخفي هو إعداد وقت معين أقصى للانتظار، إذا تم تحميل الصفحة في الوقت المحدد، يتم تنفيذ الخطوة التالية، وإلا يتم انتظار انتهاء الوقت المحدد، ثم تنفيذ الخطوة التالية. يرجى الانتباه إلى أن هناك عيبًا هنا، وهو أن البرنامج سيظل ينتظر تحميل الصفحة بالكامل، أي عادة ما ترون ذلك في شريط العناوين في متصفح الويب تلك الدائرة الصغيرة التي تتحرك، ثم يتم تنفيذ الخطوة التالية، ولكن في بعض الأحيان تكون العناصر التي أريد أن أنتظرها قد تم تحميلها بالفعل، ولكن بسبب بعض JavaScript وما إلى ذلك خاصة بطيئة، لا أزال أضطر إلى انتظار انتهاء الصفحة بالكامل قبل تنفيذ الخطوة التالية، ماذا أفعل إذا كنت أريد أن أنتظر ظهور العناصر التي أريدها ثم أتقدم إلى الخطوة التالية؟ هناك طريقة، وهذا يتطلب أن نرى كيف يقدم Selenium طريقة أخرى للانتظار - الانتظار الموضعي wait.

يجب ملاحظة أنه يلعب الانتظار الضمني دورًا مهمًا في دورة driver بأكملها، لذا يمكن ضبطه مرة واحدة فقط، رأيت من قبل أن يستخدم بعض الناس الانتظار الضمني مثل sleep في كل مكان...

3. الانتظار الواضح

الطريقة الثالثة هي الانتظار الواضح، WebDriverWait، بالإضافة إلى طريقة until() و until_not() من هذا الصنف، يمكنها الانتظار بفعالية بناءً على شرط معين. يعني ذلك بشكل رئيسي: يرى البرنامج كل xx ثانية، إذا تم تحقيق الشرط، يتم تنفيذ الخطوة التالية، وإلا يتم الاستمرار في الانتظار حتى تجاوز الوقت المحدد مسبقًا، ثم يُلقى TimeoutException.

دعنا نبدأ بعرض مثال على الكود:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10) # يمكن استخدام الانتظار الضمني والانتظار الواضح معًا، ولكن يجب الانتباه إلى أن أطول وقت انتظار يعتمد على أكبر القيم بينهما
driver.get('https://huilansame.github.io')
locator = (By.LINK_TEXT, 'CSDN')
try:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
print driver.find_element_by_link_text('CSDN').get_attribute('href')
finally:
driver.close()

في المثال السابق، قمنا بضبط الانتظار الضمني والانتظار الواضح، في العمليات الأخرى، يلعب الانتظار الضمني دورًا حاسمًا، بينما يلعب الانتظار الواضح دورًا رئيسيًا في WebDriverWait.. يجب الانتباه إلى أن أطول وقت انتظار يعتمد على أكبر القيم بينهما، في هذا المثال هو 20، إذا كان وقت الانتظار الضمني > وقت الانتظار الواضح، فإن أطول وقت انتظار للجملة هذه يساوي وقت الانتظار الضمني.

نستخدم بشكل رئيسي فئة WebDriverWait وفئة expected_conditions، وسنقوم بتفصيل هاتين الوحدتين معًا، يقودنا إليها صاحب المدونة.

WebDriverWait

فئة WebDriverWait في وحدة wait هي فئة الانتظار الموضعية، لنرى ما هي المعاملات والطرق التي تتوفر عليها:

selenium.webdriver.support.wait.WebDriverWait (فئة)
__init__
driver: يتم إدخال نموذج WebDriver، وهو driver في مثالنا السابق
timeout: وقت انتهاء المدة، أطول وقت يمكن للانتظار (ويجب النظر أيضًا في وقت الانتظار الضمني)
poll_frequency: وقت التردد في التطبيق على طريقة until أو until_not، بالافتراض 0.5 ثانية
ignored_exceptions: الاستثناءات التي يتم تجاهلها، إذا تم إلقاء هذا الاستثناء في عملية تطبيق until أو until_not، فإنه لن يوقف الكود ويستمر في الانتظار، وإذا تم إلقاء استثناء خارج هذا التجميع، فإنه سيوقف الكود ويقوم بإلقاء استثناء. بالافتراض، هناك NoSuchElementException فقط.
until
method: خلال فترة الانتظار، يتم التطبيق على هذا الطريقة المدخلة في فترات زمنية معينة حتى يتم الحصول على قيمة ليست False
message: إذا انتهت المدة، سيتم إلقاء استثناء TimeoutException، ويتم إدخال message في الاستثناء
until_not عكس until، حيث أن until تكون عندما يظهر العنصر أو يتحقق شرط ما فتبدأ التنفيذ، بينما until_not تكون عندما يختفي العنصر أو لا يتحقق شرط ما فتبدأ التنفيذ، والمعاملات متشابهة أيضًا، وسنقوم بتوضيحها.
method
message

بعد قراءة المحتوى أعلاه، يجب أن تكون واضحًا جدًا، طريقة التطبيق كالتالي:

WebDriverWait(driver, مدة الاستحقاق, تردد التطبيق, استثناءات تُغفى عنها).until(طريقة قابلة للتنفيذ, رسالة استحقاق عند انتهاء المدة)

يجب أن نكون حذرين بشكل خاص هنا من طريقة method القابلة للتنفيذ في until أو until_not، حيث أدخل العديد منهم عنصر WebElement، مثلًا:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # خطأ

هذا استخدام خاطئ، يجب أن يكون المعامل هنا قابلًا للإجراء، أي أن هذا الجسم يجب أن يكون لديه طريقة __call__، وإلا سيتم إلقاء استثناء:

TypeError: 'xxx' object is not callable

في هذا السياق، يمكنك استخدام جميع الشروط المتاحة في module expected_conditions التي يقدمها selenium، أو استخدام methods is_displayed()، is_enabled()، is_selected() من WebElement، أو استخدام methods م封装ة خاصة بك، لذا سنجد الآن الشروط المتاحة التي يقدمها selenium:

expected_conditions

expected_conditions هو module من selenium، يحتوي على مجموعة من الشروط التي يمكن استخدامها للتحقق:

selenium.webdriver.support.expected_conditions (المodule)
هذه العنصرين الحكمين يتحققان من عنوان الصفحة، ويتم التحقق من ما إذا كان العنوان المدخل title يتطابق أو يحتوي على driver.title
title_is
title_contains
هذه العنصرين الحكمين يتحققان من ما إذا كان العنصر يظهر، ويتم إدخال locator كـ tuple في كلاهما، مثل (By.ID, 'kw')
بالطبع، العنصر الحكم الاول يمر إذا تم تحميل عنصر واحد فقط يتوافق مع الشروط، والعنصر الحكم الثاني يجب أن يتم تحميل جميع العناصر المتوافقة
presence_of_element_located
presence_of_all_elements_located
هذه العنصرين الحكمين الثلاثة يتحققان من ما إذا كان العنصر مرئيًا، حيث يتم إدخال locator كـ tuple في الاثنين الاولين، و WebElement في الثالث
الاول والثالث هما نفس الشئ في الواقع
visibility_of_element_located
invisibility_of_element_located
visibility_of
هذه العنصرين الحكمين يحددان ما إذا كان نصًا معينًا يظهر في عنصر معين، الأول يحدد نص العنصر، والثاني يحدد قيمة العنصر
text_to_be_present_in_element
text_to_be_present_in_element_value
هذا العنصر الحكم يحدد ما إذا كان يمكن الدخول إلى frame، يمكن إدخال tuple locator أو إدخال طريقة التتبع مباشرة: id، name، index أو WebElement
frame_to_be_available_and_switch_to_it
هذا العنصر الحكم يحدد ما إذا كان هناك alert
alert_is_present
هذا العنصر الحكم يحدد ما إذا كان يمكن الضغط عليه، ويتم إدخال locator
element_to_be_clickable
هذه الأربعة شروط تحدد ما إذا كان العنصر مختارًا، الشروط الأولى تدخل عنصر WebElement، والثانية تدخل tuple locator
الشرط الثالث يدخل عنصر WebElement والوضع، إذا كانت متساوية فإنه يعود بالصحيح، وإلا يعود بالخطأ
الشرط الرابع يدخل locator والوضع، إذا كانت متساوية فإنه يعود بالصحيح، وإلا يعود بالخطأ
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
الشرط الأخير يحدد ما إذا كان العنصر لا يزال موجودًا في DOM، يتم إدخال عنصر WebElement، يمكن تحديد ما إذا تم تحديث الصفحة أم لا
staleness_of

الشرط الـ17 هو جميع الشروط، عند دمجها مع until و until_not يمكن تنفيذ العديد من التقييمات، وإذا تم 包装ها بشكل مرن، فإن ذلك سيزيد من استقرار السكربت.

ما ذكرته أعلاه هو شرح مفصل لثلاث طرق للانتظار في Python selenium (مهمة لمعرفة)، آمل أن يكون مفيدًا لك، إذا كان لديك أي أسئلة، فأنت مرحب بك في ترك تعليق، وسأقوم بالرد على أسئلتك في أقرب وقت، وأشكرك أيضًا على دعمك لموقع呐喊 لتعليم البرمجة!

البيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المحتوى تعود إلى صاحب الحقوق، يتم جمع المحتوى من قبل المستخدمين على الإنترنت بطرق متعمدة وبدون تدخل بشري، ولا تتحمل الموقع أي مسؤولية عن ذلك. إذا رأيت محتوى يشتبه في انتهاك حقوق النسخ، فأنت مرحب بك في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لتقديم الشكوى، وقدم الدليل المتعلق بالدليل، وسيقوم الموقع بإزالة المحتوى المزعوم فور التحقق منه.

أنت قد تعجبك