انتقل إلى المحتوى

كيفية البحث عن العناصر بواسطة XPath في السيلينيوم (دليل شامل)

باعتباري خبيرًا في استخراج الويب والوكلاء مع أكثر من 5 سنوات من الخبرة، فقد وجدت أن XPath هو أحد أكثر التقنيات المفيدة والمتعددة الاستخدامات لتحديد موقع عناصر الويب. يمكن أن يساعدك إتقان محددات XPath في استخراج البيانات حتى من صفحات الويب الأكثر تعقيدًا بدقة.

في هذا الدليل الشامل الذي يزيد عن 3200 كلمة، سأشارك كل ما تعلمته حول العثور على العناصر والتفاعل معها باستخدام XPath في السيلينيوم.

ما هو بالضبط XPath؟

قبل أن نتعمق في الاستخدام، من المهم أن نفهم ما هو XPath فعليًا.

يرمز XPath إلى لغة مسار XML. إنها لغة استعلام لتحديد العقد من مستند XML. بشكل أساسي، يوفر XPath بناء جملة لوصف أجزاء من بنية XML.

نظرًا لأن HTML منظم مثل XML، مع عناصر متداخلة مثل علامات الفتح والإغلاق، فيمكن استخدام XPath لاستهداف أجزاء من مستند HTML أيضًا.

وفقًا لـ w3schools، بعض الحقائق الأساسية حول XPath:

  • يستخدم XPath تعبيرات المسار لتحديد العقد أو مجموعات العقد في مستند XML
  • تبدو تعبيرات المسار هذه تشبه إلى حد كبير تعبيرات المسار التي تراها عند العمل مع نظام ملفات الكمبيوتر التقليدي
  • يحتوي XPath على أكثر من 100 وظيفة مدمجة لمعالجة السلاسل والأرقام والقيم المنطقية ومجموعات العقد وما إلى ذلك.
  • يعد XPath عنصرًا رئيسيًا في XSLT (تحويلات لغة أوراق الأنماط القابلة للتوسيع)

باختصار، XPath هي لغة استعلام واستخراج قوية مصممة للتنقل في مستندات XML.

كيف يرتبط XPath بالسيلينيوم؟

السيلينيوم هو إطار عمل آلي للتحكم في متصفحات الويب. عند تحميل صفحة ويب في السيلينيوم، يتم تحليل محتوى HTML إلى بنية DOM (نموذج كائن المستند).

يمثل DOM الصفحة بشكل مرئي كشجرة من عناصر HTML المتداخلة.

يمكن استخدام XPath لاجتياز DOM للعثور على عناصر محددة في الصفحة والتفاعل معها.

على سبيل المثال، خذ بعين الاعتبار HTML المبسط هذا:

<html>
<body>

  <div>
    <p>Hello World!</p>
  </div>

  <div>
    <img src="logo.png"/>
  </div>

</body>
</html>

قد يبدو DOM شيئًا مثل هذا:

       html
       /  \
     body   
     / \     
    div  div
      |    |
     p    img

يمكنك بعد ذلك استخدام تعبيرات XPath للاستعلام عن العناصر داخل هذه البنية:

/html/body/div[1]/p
//div/img

وهذا يجعل XPath مفيدًا بشكل لا يصدق لأتمتة الإجراءات على أجزاء معينة من الصفحة باستخدام السيلينيوم.

أساسيات بناء جملة XPath

الآن بعد أن فهمت دور XPath، دعنا نتعمق في بناء الجملة.

يستخدم XPath تعبيرات المسار لتحديد العناصر والسمات في مستند XML. تبدو التعبيرات مشابهة جدًا للمسارات الموجودة في نظام الملفات مثل جهاز الكمبيوتر الخاص بك:

/Users/jsmith/Documents/letter.docx

الشرطة المائلة للأمام / تنتقل للأسفل عبر المجلدات المتداخلة.

بعض أنماط XPath الأساسية:

  • nodename - تحديد جميع العقد التي تحمل اسم العقدة
  • / - يختار من العقدة الجذرية
  • // - يختار العقد في أي عمق
  • . – تحديد العقدة الحالية
  • .. – تحديد العقدة الأصلية
  • @ - يختار السمات

فمثلا:

/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere 
div[@class=‘header‘] - Selects div tags with matching class attribute

هناك العديد من تركيبات الجملة المتخصصة التي سنغطيها خلال هذا الدليل. لكن هذه الأنماط الأساسية تسمح لك بالبدء في صياغة محددات XPath المستهدفة.

وفقًا لخبرتي، فإن إتقان 5-10 تعبيرات XPath أساسية فقط سيمكنك من تحديد العناصر الموجودة في غالبية مواقع الويب.

البحث عن عناصر الويب باستخدام find_element و find_elements

يوفر السيلينيوم طريقتين أساسيتين لتحديد موقع العناصر باستخدام XPath:

  • find_element() - إرجاع WebElement واحد مطابق لـ XPath
  • find_elements() – إرجاع قائمة بجميع عناصر WebElements المطابقة

فيما يلي مثال بسيط للاستخدام:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# Find single element
element = driver.find_element(By.XPATH, ‘//img‘) 

# Find multiple elements 
elements = driver.find_elements(By.XPATH, ‘//div‘)

باستخدام هاتين الطريقتين، يمكنك البدء في الاستفادة من قوة XPath للتفاعل مع أجزاء معينة من صفحة الويب بطريقة تلقائية.

نصائح للعثور على العناصر

بناءً على سنوات خبرتي، إليك بعض النصائح الأساسية عند إنشاء محددات XPath:

  • فحص مصدر HTML – يتيح لك عرض محتوى HTML الأولي تحديد السمات والأنماط الفريدة للعناصر المستهدفة. تحتوي جميع المتصفحات الحديثة على أدوات مطور لعرض المصدر.

  • انسخ XPath في المتصفح - تشتمل معظم أدوات تطوير المتصفح أيضًا على وظيفة نسخ XPath الكامل للعنصر. يمكنك بعد ذلك تعديل وتبسيط محددات خط الأساس هذه.

  • التركيز على الهوية - توفر سمة معرف عنصر الصفحة أكثر المحددات المباشرة والفريدة من نوعها //input[@id=‘search‘].

  • تساعد الطبقات - سمات الفئة تسمح باستعلامات أكثر مرونة مثل //div[@class=‘results‘] حتى لو لم تكن فريدة تمامًا.

  • تجنب الفهارس - الاعتماد على المؤشرات الموضعية مثل [1]، [2] يؤدي إلى هشاشة محددات المواقع.

  • أقصر هو أفضل - يساعد XPath المختصر مع الحد الأدنى من الخطوات المتداخلة على تجنب الاستعلامات البطيئة أو المطابقات غير الصحيحة.

سيساعدك إتقان هذه الإرشادات على إنشاء محددات XPath قوية تستهدف عناصر الصفحة المطلوبة بشكل أنيق.

أنماط ووصفات XPath الشائعة

بما أنك الآن تفهم الأساسيات، فلنلقِ نظرة على بعض الأمثلة الشائعة لأنماط XPath:

حدد حسب قيمة السمة

//input[@type=‘submit‘]
//a[@href=‘contact.html‘]

مطابقة السمات الجزئية

//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]

حدد مطابقة النص

//p[text()=‘Hello World‘] 
//h2[contains(text(), ‘Welcome‘)]

حدد الأطفال

/div/p
//tbody/tr/td

التحديد المفهرس

(//input[@type=‘button‘])[2]

اختيار بالسلاسل

//div[@id=‘nav‘]/ul/li/a 

متابعة الأشقاء

//h1[text()=‘Articles‘]/following-sibling::p

أوصي بالتعرف على كل من هذه التقنيات الشائعة. إنها تشكل مجموعة أدوات من مهارات XPath التي ستخدمك جيدًا عند إنشاء استعلامات قوية.

مثال القشط

دعونا نستعرض مثالاً لبرنامج نصي لتجميع الويب باستخدام السيلينيوم وXPath في Python.

سنقوم باستخراج بيانات المنتج من موقع التجارة الإلكترونية:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# Initialize driver 
driver = webdriver.Chrome(‘/path/to/chromedriver‘)

# Load page
driver.get(‘https://www.example.com‘)

# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()

# Wait for new page to load
time.sleep(5)  

# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text 
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text

print(name, description, price)

# Close browser
driver.quit()

يوضح هذا كيف يمكن استخدام XPath لاستهداف العناصر بدقة لاستخراج بيانات الصفحة المتداخلة.

المشكلات الشائعة والحلول

فيما يلي بعض المشكلات الشائعة التي يمكن أن تحدث عند استخدام محددات مواقع XPath في السيلينيوم إلى جانب إستراتيجيات التخفيف:

مهلة

إذا استغرق تحميل الصفحات وقتًا، فاستخدم فترات الانتظار الضمنية والصريحة:

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

العناصر التي لا معنى لها

إذا تغير DOM، فأعد تحديد موقع العناصر لتجنب استثناءات العناصر التي لا معنى لها:

elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘) 

التوافق المتصفح

قد لا تعمل بعض ميزات XPath المتقدمة عبر جميع المتصفحات. اختبار السلوك وتبسيطه إذا لزم الأمر.

أداء بطيء

يمكن أن تؤدي تعبيرات XPath المعقدة جدًا إلى إبطاء تنفيذ الاختبار. تبسيط الهيكل حيثما أمكن ذلك.

وضوح

قد لا تكون العناصر المطابقة مرئية بالضرورة. تأكد من عرضها قبل التفاعل.

تساعد الخبرة على توقع هذه المشكلات، حيث يصبح التعامل معها أسهل بكثير بمرور الوقت.

بدائل XPath

على الرغم من أن XPath قوي، إلا أنه ليس الحل الأفضل دائمًا. فيما يلي بعض البدائل الشائعة:

محددات CSS

توفر محددات CSS طريقة بسيطة ومألوفة للعثور على العناصر:

driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘) 

سمات المعرف والاسم

إذا كانت المعرفات أو الأسماء فريدة حقًا، فاستخدم:

driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘) 

رابط نصي

يمكن أن تؤدي مطابقة نص الرابط الكامل إلى تجنب الاستعلامات المعقدة:

driver.find_element(By.LINK_TEXT, ‘Logout‘)

قم بتقييم كل خيار وفقًا لاحتياجاتك المحددة. غالبًا ما أجد مجموعة من محددات مواقع نص XPath وCSS وID ومحددات الارتباط توفر أقصى قدر من القوة.

مقارنة استراتيجيات تحديد المواقع

فيما يلي مقارنة بين XPath وبعض إستراتيجيات تحديد مواقع العناصر البديلة الشائعة:

خدمة التوصيلمثالالايجابياتسلبيات
كسباث//شعبة/صاستعلامات مرنة للغايةبناء جملة معقد
CSS محددdiv.النتائج صتركيب مألوفيستهدف فقط الفئة/المعرف/السمات
ID#التسجيل منسريع جدًا وفريد ​​من نوعهيتطلب معرفات
الاسمname=queryالتفرُّدالاعتماد على اصطلاحات التسمية
ربط النصتسجيل الخروجبسيطة للروابطفقط لنص الرابط

كما ترون، كل استراتيجية لها مقايضات. يمكن أن يوفر استخدام XPath مع محددات CSS وسماتها مرونة قوية في تحديد المواقع.

الاستخدام المتقدم مع lxml و parsel

في حين أن السيلينيوم يحتوي على طرق بحث مدمجة سهلة الاستخدام، فإن مكتبات التحليل المخصصة مثل lxml وparsel توفر قوة إضافية لمهام الكشط المعقدة.

توفر هذه المكتبات دعمًا قويًا لـ XPath إلى جانب العديد من الميزات الأخرى مثل:

  • موزعي HTML وXML سريعين
  • دعم XPath 1.0 و2.0+
  • مجموعة واسعة من وظائف ومشغلي XPath
  • روابط مريحة لتحليل HTML
  • التكامل مع الأطر الشعبية مثل Scrapy

بعض الأمثلة على الاستخدام:

from lxml import html

tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)

from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall() 

بالنسبة لمهام الكشط الأثقل، غالبًا ما ألجأ إلى هذه المكتبات لاستكمال قدرات السيلينيوم المدمجة.

الاستنتاج والدروس الرئيسية

يعد البحث عن العناصر بواسطة XPath أسلوبًا أساسيًا لأي شخص يستخدم السيلينيوم لأتمتة الاختبار أو تجريف الويب.

فيما يلي بعض الدروس الأساسية التي تعلمتها خلال أكثر من 5 سنوات من الاستفادة من XPath للتفاعل مع المواقع المعقدة:

  • ابدأ بتعلم بعض أنماط XPath الأساسية مثل مطابقة السمات، واختيار النص، واختيار الطفل، وما إلى ذلك. تعتمد معظم الاستخدامات على هذه الأساسيات.

  • إن تحقيق التوازن بين الاستعلامات المختصرة والفريدة من نوعه يتطلب ممارسة. إنه فن بقدر ما هو علم.

  • تعرف على أدوات مطور المتصفح لفحص المصدر ونسخ سلاسل XPath الأولية.

  • أكمل XPath بمحددات CSS وسمات المعرف/الاسم عندما يكون ذلك مناسبًا. الجمع بين النهج يؤدي إلى أقصى قدر من المتانة.

  • خذ بعين الاعتبار مكتبات تحليل XPath المتقدمة مثل lxml وparsel لتحسين قدرة التجريد بما يتجاوز السيلينيوم.

  • تعلم كيفية توقع المشكلات الشائعة والتعامل معها مثل العناصر القديمة والمهلات بمرور الوقت من خلال الخبرة.

آمل أن يكون هذا الدليل قد قدم مرجعًا شاملاً لفتح قوة اختيار عنصر XPath باستخدام السيلينيوم. اسمحوا لي أن أعرف إذا كان لديك أي أسئلة محددة أخرى!

الوسوم (تاج):

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *