English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
العديد من الأشخاص يسألون في المجموعات، لا يمكن تحديد هذا القائمة المنسدلة أو ذلك النافذة المنبثقة... لا يمكن تحديد كل نوع من التحديد، في الواقع، في معظم الحالات هناك اثنين من المشاكل: 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 (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لتقديم الشكوى، وقدم الدليل المتعلق بالدليل، وسيقوم الموقع بإزالة المحتوى المزعوم فور التحقق منه.