1. Səhifədə elementlərin axtarışının əsasları
Elementlərin axtarış metodlarının istifadəsi
Selenium-u real layihələrdə istifadə etməyə başlayanda əsas tapşırıqlardan biri səhifədə elementlərin axtarışı olacaq. Bu, oteldə lift düyməsini axtarmağa bənzəyir: hansı yerdə olduğunu bilmək lazımdır ki, basıb istədiyin mərtəbəyə qalxa biləsən.
Selenium, elementlərin axtarışı üçün bir neçə metod təqdim edir. Sənin üstünlüklərinə görə aşağıdakılardan istifadə edə bilərsən: find_element_by_id
, find_element_by_name
, find_element_by_xpath
, find_element_by_css_selector
, və s. Gəlin artıq bildiklərimizi xatırlayıb sadə bir nümunə yazaq:
from selenium import webdriver
# Brauzer obyektini yaradırıq (burda Chrome istifadə olunur)
driver = webdriver.Chrome()
# Səhifəni açırıq
driver.get('http://example.com')
# ID ilə elementin axtarışı
element_by_id = driver.find_element_by_id('main')
# Ad ilə elementin axtarışı
element_by_name = driver.find_element_by_name('username')
# XPath ilə elementin axtarışı
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# CSS-selektor ilə elementin axtarışı
element_by_css = driver.find_element_by_css_selector('div.content')
find_element və find_elements arasında fərqlər
Səhifədə bir neçə elementi tapmaq istəyirsənsə (məsələn, bütün btn
sinifinə aid olan düymələr), find_elements
metoduna ehtiyacın olacaq. find_element
və find_elements
arasındakı fərq ondadır ki, birincisi tək bir element qaytarır, ikincisi isə elementlərin siyahısını qaytarır.
# Tək elementin axtarışı
single_element = driver.find_element_by_class_name('btn')
# Bir neçə elementin axtarışı
multiple_elements = driver.find_elements_by_class_name('btn')
# Tapılmış elementlərə baxış
for element in multiple_elements:
print(element.text)
Gördüyün kimi, find_elements
səhifədə bir neçə ola biləcək elementlər kolleksiyası ilə işləmək üçün əladır. Hər bir find_element_xxx
metodunun öz find_elements_xxx
metodu var ki, bu da elementlərin siyahısını qaytarır.
2. Elementlərlə interaktiv qarşılıqlı əlaqə
Düymələr, linklər və daxil etmə sahələri ilə işləmək
İndi siz elementləri necə tapmağı xatırladınızsa, onlarla qarşılıqlı əlaqə qurmağın vaxtıdır! Bu, LEGO dəsti ilə oynamağa bənzəyir: düzgün elementləri birləşdirərək planınızı həyata keçirmək lazımdır.
Elementlərlə qarşılıqlı əlaqə Selenium tərəfindən təqdim edilən metodlar vasitəsilə həyata keçirilə bilər. Gəlin bunun necə edildiyini bir daha nəzərdən keçirək:
# Düyməyə klik etmək
button = driver.find_element_by_id('submit')
button.click()
# Daxil etmə sahəsinə mətn yazmaq
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium dərsləri')
# Elementin mətnini əldə etmək
header = driver.find_element_by_tag_name('h1')
print(header.text)
Hadisələrin işlənməsi və dinamik elementlərlə hərəkətlər
Söhbət yalnız müəyyən bir hərəkətdən sonra görünən düymələr kimi dinamik elementlərlə işləməkdən gedirsə, gecikmələri və gözləmələri nəzərə almaq vacibdir. Selenium bu cür elementlərin yüklənməsini gözləmək yollarını təqdim edir. Onlardan biri — WebDriverWait
sinfinin və expected_conditions
ilə birlikdə istifadəsidir.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Düymənin 10 saniyə ərzində görünməsini gözləmək
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
Qeyd. Hər dəfə expected_conditions
yazmamaq üçün onu import edərkən EC
kimi adlandırdıq.
Gözləmələrdən istifadə skriptinizin daha etibarlı olmasına və səhifənin yavaş yüklənməsi və ya vaxt fərqlərinə görə çöküb qalmamasına kömək edir. Təcrübədə belə hallar olduqca tez-tez baş verir - demək olar ki, həmişə :)
3. Nələr səhv gedə bilər?
Hər şey. Hər şey səhv gedə bilər. Siz elementlərlə qarşılıqlı əlaqə yaratmağa hazırlaşırsınız, amma bax, qəfil nəsə səhv gedir. Gəlin bu yolda rastlaşa biləcəyiniz bəzi tipik səhvləri müzakirə edək.
İlk olaraq, NoSuchElementException
— bu olduqca tez-tez qarşılaşacağınız bir xəta mesajıdır, xüsusən axtardığınız element səhifədə yoxdursa. Bu, olmayan bir elementi tapmaq istəsəniz yaranır. Belə situasiyaların qarşısını almaq üçün try-except
metodundan istifadə edərək istisnaları idarə edə bilərsiniz.
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("Oops, deyəsən, element tapılmadı!")
Həmçinin dinamik elementlər və yükləmə vaxtı ilə bağlı problemlər də mümkündür. Bu halda, elementlərin yüklənməsini gözləmək üçün WebDriverWait
istifadə edin, bunu daha əvvəl müzakirə etdik.
GO TO FULL VERSION