فهم وإصلاح أخطاء جافا سكريبت الشائعة في السيلينيوم
عند تجريف الويب باستخدام برنامج تشغيل الويب السيلينيوم، فإن مواجهة الأخطاء المتعلقة بجافا سكريبت أمر شائع، خاصة عند التعامل مع عناصر الويب الديناميكية مثل DOM الظل. أحد الأخطاء المتكررة التي يواجهها المطورون هو JavascriptException: لا يمكن قراءة خصائص فارغة (قراءة "shadowRoot")والذي يحدث غالبًا عند التفاعل مع عناصر الصفحة المعقدة.
ينشأ هذا الخطأ عادةً عندما يتعذر على السيلينيوم الوصول إلى العناصر الموجودة داخل الملف أو التفاعل معها ظل دوم، وهو نوع فريد من بنية DOM المغلفة التي تستخدمها العديد من مواقع الويب الحديثة للحصول على نمطية أفضل. في لغة Python، قد يكون استخدام السيلينيوم للتحكم في المتصفح أمرًا صعبًا مع مثل هذه العناصر.
في سياق استخراج الويب من منصات مثل Shopee، غالبًا ما تستخدم النوافذ المنبثقة أو اللافتات عناصر DOM الظلية، والتي قد يكون من الصعب إغلاقها برمجيًا. يمكن أن تعيق هذه المشكلة التدفق السلس للمهام الآلية وتعطل عملية جمع البيانات.
سيرشدك هذا الدليل إلى حل واضح لمعالجة المشكلة "لا يمكن قراءة خصائص Null" الخطأ وتوفير نهج عملي لإغلاق النوافذ المنبثقة المضمنة في DOMs الظل في Shopee باستخدام بايثون السيلينيوم.
يأمر | مثال للاستخدام |
---|---|
shadowRoot | يُستخدم هذا للوصول إلى العناصر داخل DOM الظل. يقوم Shadow DOM بعزل عناصر معينة من شجرة DOM الرئيسية، مما يتطلب خاصية ShadowRoot للوصول إليها. في هذا البرنامج النصي، يتم استخدامه لتحديد موقع زر الإغلاق داخل النافذة المنبثقة. |
execute_script() | تسمح طريقة السيلينيوم هذه بتنفيذ جافا سكريبت الخام داخل جلسة المتصفح. يعد ذلك ضروريًا عند التفاعل مع عناصر Shadow DOM نظرًا لأن طرق السيلينيوم التقليدية قد لا تعمل. |
WebDriverWait() | يقوم هذا الأمر بإعداد فترات انتظار صريحة في السيلينيوم. فهو يضمن أن ينتظر البرنامج النصي حتى يتم استيفاء شرط محدد، مثل أن يصبح العنصر قابلاً للنقر عليه. يعد هذا أمرًا بالغ الأهمية لتحميل المحتوى الديناميكي، كما هو موضح في النوافذ المنبثقة لـ Shopee. |
expected_conditions | تحتوي هذه الوحدة على الشروط التي يمكن استخدامها مع WebDriverWait، مثل رؤية العنصر أو وجوده. فهو يضمن أن عمليات مثل النقر تحدث فقط عندما تكون العناصر المستهدفة جاهزة. |
EC.presence_of_element_located() | شرط يستخدم مع WebDriverWait للتأكد من وجود العنصر المستهدف في DOM. يعد هذا مفيدًا بشكل خاص عند انتظار تحميل العناصر الموجودة في DOM الظل. |
EC.element_to_be_clickable() | هناك شرط آخر مفيد في WebDriverWait، وهو يضمن أن يكون العنصر المستهدف مرئيًا وقابلاً للنقر قبل محاولة أي تفاعلات، مما يقلل الأخطاء في صفحات الويب الديناميكية. |
By.CSS_SELECTOR | تسمح هذه الطريقة بتحديد العناصر عبر محددات CSS الخاصة بها. إنه مفيد بشكل خاص عند استهداف العناصر داخل DOM الظل، والتي قد لا يمكن الوصول إليها باستخدام أساليب XPath القياسية. |
driver.quit() | يضمن إغلاق مثيل المتصفح بشكل صحيح بعد انتهاء تشغيل البرنامج النصي. من أفضل الممارسات المهمة تجنب ترك جلسات المتصفح المفتوحة. |
كيفية التعامل مع Shadow DOM والنوافذ المنبثقة في تجريف ويب السيلينيوم
تهدف البرامج النصية المقدمة أعلاه إلى معالجة مشكلة شائعة تتم مواجهتها عند تجريف الويب برنامج تشغيل الويب السيلينيوم عند التفاعل مع عناصر Shadow DOM. يعد Shadow DOM جزءًا من صفحة الويب التي تعمل بشكل منفصل عن DOM الرئيسي، وغالبًا ما يستخدم في مكونات الويب المعقدة. في سياق مواقع استخراج البيانات مثل Shopee، تظهر النوافذ المنبثقة بشكل متكرر داخل DOMs الظلية، مما قد يؤدي إلى حدوث أخطاء إذا تم الوصول إليها باستخدام طرق السيلينيوم التقليدية. تم تصميم البرنامج النصي الأول لإغلاق النافذة المنبثقة باستخدام تنفيذ JavaScript من خلال Execute_script()، أداة قوية تسمح للسيلينيوم بتشغيل جافا سكريبت الخام داخل سياق المتصفح.
التحدي الرئيسي هو أن العناصر الموجودة داخل DOM الظل لا يمكن الوصول إليها باستخدام أوامر السيلينيوم الشائعة مثل find_element_by_xpath(). بدلاً من ذلك، نستخدم JavaScript للانتقال إلى DOM الظل باستخدام ملف com.shadowRoot ملكية. يستهدف البرنامج النصي زر الإغلاق الخاص بنافذة Shopee المنبثقة عن طريق الوصول أولاً إلى عنصر مضيف الظل الخاص بها، ثم الاستعلام عن بنيتها الداخلية. من خلال الاستفادة driver.execute_script()، فإن البرنامج النصي قادر على التعامل مع العناصر وإغلاقها داخل DOM المعزول. يعمل هذا الحل بشكل جيد عند دمجه مع فترات انتظار صريحة للتعامل مع عناصر الصفحة الديناميكية التي يتم تحميلها بشكل غير متزامن.
يقدم السيناريو الثاني WebDriverWait، أداة أساسية لإدارة توقيت عناصر الصفحة الديناميكية. نظرًا لأن النوافذ المنبثقة الخاصة بـ Shopee يتم تحميلها بشكل غير متزامن، فقد يؤدي التفاعل المباشر مع هذه العناصر إلى حدوث أخطاء. لتجنب هذا، WebDriverWait() يضمن أن العناصر التي نرغب في التفاعل معها محملة بالكامل وجاهزة. ينتظر هذا البرنامج النصي وجود كل من عنصر DOM الرئيسي وعناصر DOM الظلية. الطريقة EC.presence_of_element_located() يضمن أن السيلينيوم يتفاعل مع العناصر فقط بعد أن تكون مرئية وحاضرة، وهو أمر بالغ الأهمية لتجنب الأخطاء المرجعية الفارغة.
في كلا البرنامجين، نتعامل مع حالات الخطأ باستخدام ملف محاولة باستثناء block لضمان عدم تعطل البرنامج بسبب أخطاء غير متوقعة، مثل عدم العثور على العناصر. تعد معالجة الأخطاء أمرًا مهمًا بشكل خاص عند حذف مواقع الويب التي تقوم بتحديث بنيتها بشكل متكرر أو تغيير سلوك النوافذ المنبثقة. بالإضافة إلى ذلك، تتبع هذه البرامج النصية أفضل الممارسات من خلال إنهاء جلسة المتصفح باستخدام driver.quit() بعد التنفيذ لتجنب تسرب الذاكرة أو مشاكل الأداء.
التعامل مع Shadow DOM وإغلاق النوافذ المنبثقة باستخدام السيلينيوم في Python
استخدام Python مع Selenium WebDriver للتفاعل مع عناصر Shadow DOM والتعامل مع النوافذ المنبثقة ديناميكيًا.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import JavascriptException
import time
# Initialize WebDriver with Chrome
options = Options()
driver = webdriver.Chrome(service=Service(), options=options)
# Open Shopee website
driver.get('https://www.shopee.co.th/')
# Click the Thai language button
th_button = driver.find_element(By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button')
th_button.click()
# Pause to allow popups to load
time.sleep(3)
# Try to close the shadow DOM popup
try:
close_button = driver.execute_script('return document.querySelector("shopee-banner-popup-stateful")'
'.shadowRoot.querySelector("div.shopee-popup__close-btn")')
close_button.click()
except JavascriptException as e:
print("Error: ", e)
# Close the browser
driver.quit()
استخدام WebDriverWait لتفاعل Shadow DOM
استخدام فترات انتظار صريحة في السيلينيوم للتأكد من أن العناصر الموجودة داخل Shadow DOM جاهزة للتفاعل.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# Initialize WebDriver with Chrome
options = Options()
driver = webdriver.Chrome(service=Service(), options=options)
# Open Shopee website
driver.get('https://www.shopee.co.th/')
# Click the Thai language button
th_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button'))
)
th_button.click()
# Wait for the shadow DOM popup to be present
try:
shadow_host = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'shopee-banner-popup-stateful'))
)
shadow_root = driver.execute_script('return arguments[0].shadowRoot', shadow_host)
close_button = shadow_root.find_element(By.CSS_SELECTOR, 'div.shopee-popup__close-btn')
close_button.click()
except Exception as e:
print("Error closing the popup: ", e)
# Close the browser
driver.quit()
التعامل مع المحتوى الديناميكي باستخدام Selenium WebDriver
هناك جانب رئيسي آخر يجب مراعاته عند العمل مع Selenium WebDriver لتجريد الويب وهو كيفية التعامل معه المحتوى الديناميكي يتم تحديثه أو تغييره بشكل مستمر بعد تحميل الصفحة. تستخدم العديد من مواقع الويب الحديثة، مثل Shopee، JavaScript لتحميل المحتوى وتحديثه ديناميكيًا. وهذا يعني أن العناصر الموجودة على الصفحة قد لا تكون متاحة على الفور بعد تحميل الصفحة. في مثل هذه الحالات، قد لا يكون سلوك السيلينيوم الافتراضي المتمثل في انتظار حدث تحميل الصفحة كافيًا. باستخدام ينتظر صريح مثل WebDriverWait يمكن حل هذه المشكلة عن طريق انتظار ظهور عناصر محددة أو أن تصبح قابلة للنقر عليها.
لاستخراج المواقع التي تحتوي على نوافذ منبثقة أو لافتات أو مكونات واجهة مستخدم معقدة تعتمد عليها DOM الظل، فمن الضروري معرفة كيفية التفاعل معهم. تخفي هذه المكونات عناصر داخل بنية DOM معزولة لا يمكن الوصول إليها بالطرق التقليدية مثل محددات XPath أو CSS. باستخدام Execute_script() يساعد الأمر على سد هذه الفجوة من خلال السماح لك بتشغيل JavaScript مباشرة داخل المتصفح، مما يتيح لك الوصول إلى Shadow DOM والسماح بالتفاعل مع عناصر مثل أزرار الإغلاق أو حقول النموذج داخل تلك الأجزاء المخفية من الصفحة.
بالإضافة إلى ذلك، تصبح معالجة الأخطاء أمرًا بالغ الأهمية في مثل هذه الحالات. يمكن لمواقع الويب في كثير من الأحيان تغيير بنيتها، مما يؤدي إلى تعطل كاشطات البيانات. الاستخدام السليم ل محاولة باستثناء تتيح لك الكتل في Python اكتشاف أخطاء مثل JavascriptException والتعامل معها بأمان، مما يضمن عدم تعطل المكشطة بشكل غير متوقع. يمكن أن يساعد دمج التسجيل لالتقاط تفاصيل الخطأ في تحديد السبب الجذري وحله في عمليات الخدوش المستقبلية.
الأسئلة المتداولة حول التعامل مع Shadow DOMs والنوافذ المنبثقة في السيلينيوم
- ما هو Shadow DOM ولماذا يصعب الوصول إليه؟
- ال shadow DOM هي شجرة DOM معزولة يستخدمها مطورو الويب لتغليف العناصر ومنعها من التأثر بالأنماط أو البرامج النصية في المستند الرئيسي. من الصعب الوصول إليها لأن طرق السيلينيوم التقليدية لا تدعم التفاعل المباشر مع عناصر DOM الظلية.
- كيف execute_script() مساعدة في التفاعل مع DOM الظل؟
- execute_script() يسمح بتشغيل JavaScript مباشرة داخل جلسة المتصفح، مما يتيح الوصول إلى عناصر DOM الظلية، والتي لا يمكن الوصول إليها باستخدام أوامر السيلينيوم العادية.
- لماذا WebDriverWait هل من المهم استخراج المحتوى الديناميكي؟
- WebDriverWait يضمن أن البرنامج النصي ينتظر شروطًا معينة، مثل أن يكون العنصر قابلاً للنقر أو موجودًا، قبل التفاعل معه. يعد هذا أمرًا بالغ الأهمية للتعامل مع المحتوى الديناميكي الذي يتم تحميله بشكل غير متزامن.
- ماذا علي أن أفعل عندما أواجه JavascriptException؟
- JavascriptException يحدث عندما تكون هناك مشكلة في تنفيذ تعليمات JavaScript البرمجية. تنفيذ معالجة الأخطاء باستخدام try-except يمكن أن تساعد الكتل في اكتشاف هذه الأخطاء وإدارتها دون تعطل البرنامج النصي بأكمله.
- كيف يمكنني إغلاق النوافذ المنبثقة الديناميكية التي تستخدم DOMs الظل؟
- لإغلاق النوافذ المنبثقة الديناميكية المغلفة في ظل DOM، تحتاج أولاً إلى الوصول إلى جذر الظل باستخدام execute_script() ثم حدد موقع زر إغلاق النافذة المنبثقة داخل Shadow DOM.
الأفكار النهائية حول التعامل مع Shadow DOM في السيلينيوم
قد يكون التفاعل مع عناصر DOM الظلية أمرًا صعبًا عند استخدام السيلينيوم لتجريد الويب. ومع ذلك، من خلال استخدام تنفيذ JavaScript والانتظار الصريح، يمكنك إدارة العناصر التي يصعب الوصول إليها باستخدام الطرق القياسية بشكل فعال.
من خلال التعامل مع الأخطاء بشكل صحيح ودمج فترات الانتظار، يمكنك التأكد من أن نصوص التجريد الخاصة بك قوية وموثوقة. ستساعد هذه التقنيات في تجنب المخاطر الشائعة عند العمل مع المحتوى الديناميكي والنوافذ المنبثقة المضمنة في DOMs الظلية، مما يضمن تجربة استخراج أكثر سلاسة.
مصادر ومراجع مفيدة للتعامل مع Shadow DOM في السيلينيوم
- معلومات حول التفاعل مع عناصر Shadow DOM في السيلينيوم من وثائق السيلينيوم WebDriver .
- رؤى حول التعامل مع أخطاء JavascriptException من تجاوز سعة المكدس .
- إرشادات حول أفضل الممارسات لاستخراج المحتوى الديناميكي من الويب باستخدام بايثون الحقيقية .