杰瑞科技汇

Python webdriver li元素定位失败怎么办?

Harika bir soru! Python'da web otomasyonu için kullanılan selenium kütüphanesinin temelini oluşturan WebDriver'ı detaylı bir şekilde inceleyelim.

Python webdriver li元素定位失败怎么办?-图1
(图片来源网络,侵删)

WebDriver, tarayıcınızı (Chrome, Firefox, vb.) doğrudan kontrol etmenize olanak tanıyan bir arayüzdür. Python kodunuzla tarayıcıyı açmak, sayfaları gezinmek, butonlara tıklamak, formları doldurmak ve veri çekmek gibi işlemleri yapmanızı sağlar.

İşte WebDriver ile ilgili her şeyi adım adım ele alalım:


Temel Kavramlar: WebDriver Nedir?

  • Tarayıcı Otomasyonu: WebDriver, tarayıcınızın kendisi gibi davranır. Gerçek bir kullanıcı gibi sayfaları açar, fare hareketlerini taklit eder ve klavye girişleri yapar.
  • İstemci-Sunucu Mimarisi: Python kodunuz (istemci), tarayıcınızın "önbelleklenmiş" sürümünü (sunucu) kontrol eder. Python kodunuz bir komut gönderdiğinde, WebDriver bu komutu tarayıcıya iletir ve tarayıcının yanıtını size geri getirir.
  • Dil Bağımsızdır: WebDriver API'si birçok programlama dilinde (Python, Java, C#, vb.) kullanılabilir. Sadece tarayıcıyı kontrol etme mantığı aynıdır.

Kurulum

Öncelikle selenium kütüphanesini ve tarayıcınız için gerekli "driver"ı kurmanız gerekir.

Adım 1: Selenium Kütüphanesini Kurun

Terminal veya komut istemcisini açıp şu komutu çalıştırın:

Python webdriver li元素定位失败怎么办?-图2
(图片来源网络,侵删)
pip install selenium

Adım 2: Tarayıcı Driver'ını Kurun

WebDriver, tarayıcınızı kontrol etmek için özel bir "sürücü" dosyasına ihtiyaç duyar. Her tarayıcının kendi sürücüsü vardır.

En Popüler Tarayıcılar ve Sürücüleri:

  1. Google Chrome için ChromeDriver
  2. Mozilla Firefox için GeckoDriver
  3. Microsoft Edge için EdgeDriver

Sürücü Kurulumu (İki Yöntem):

Yöntem A: Manuel Kurulum (Klasik Yöntem)

Python webdriver li元素定位失败怎么办?-图3
(图片来源网络,侵删)
  1. Sürücüyü İndirin: Kullandığınız tarayıcının ve işletim sisteminin sürümüne uygun driver'ı resmi web sitesinden indirin.
  2. Yolunu Ayarlayın: İndirdiğiniz chromedriver.exe (Windows) veya chromedriver (macOS/Linux) dosyasını, projenizin olduğu klasöre koyun veya sistem PATH değişkeninize ekleyin. Python kodunuzda bu dosyanın yolunu belirtmeniz gerekir.

Yöntem B: Otomatik Yönetim (Tavsiye Edilen Yöntem - webdriver-manager)

Her driver'ı manuel olarak indirmek ve yönetmek can sıkıcıdır. webdriver-manager adlı kütüphane, doğru driver'ı otomatik olarak indirir ve yönetir. Bu yöntem çok daha pratiktir.

Kurulumu yapalım:

pip install webdriver-manager

Bu kütüphaneyi kullanarak driver' yolunu elle belirtmenize gerek kalmaz.


İlk WebDriver Örneği (Chrome ile)

İşte en temel bir otomasyon senaryosu: Google'ı açıp, "Python" aratmak.

Örnek Kod (Manuel Driver Yolu ile):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time # Sayfanın yüklenmesini beklemek için
# 1. WebDriver'ı başlat (Chrome için)
# Eğer driver'ı PATH'e eklediyseniz sadece 'webdriver.Chrome()' yeterlidir.
# Değilse, tam yolunu belirtmelisiniz.
# driver_path = "C:/Users/KullaniciAdi/Downloads/chromedriver.exe"
# driver = webdriver.Chrome(executable_path=driver_path)
driver = webdriver.Chrome()
# 2. Tarayıcıyı tam ekran yap
driver.maximize_window()
# 3. Bir web sitesine git
driver.get("https://www.google.com")
# 4. Arama kutusunu bul (ID ile)
# Google'ın arama kutusunun ID'si "APjFqb"
search_box = driver.find_element(By.ID, "APjFqb")
# 5. Arama kutusuna "Python" yaz ve Enter'a bas
search_box.send_keys("Python")
search_box.send_keys(Keys.ENTER)
# 6. Sayfanın yüklenmesi için biraz bekle
time.sleep(2) # Gerçek uygulamalarda bu yerine bekleme (wait) stratejileri kullanılmalı.
# 7. Tarayıcıyı kapat
driver.quit()

Örnek Kod (webdriver-manager ile - Tavsiye Edilen):

Bu kod, webdriver-manager'ın gücünü gösterir. driver_path yazmaya gerek kalmaz!

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import time
# 1. WebDriver'ı otomatik olarak yöneterek başlat
# ChromeDriverManager().install() doğru driver'ı indirir ve yolunu verir.
service = ChromeService(ChromeDriverManager().install())
driver = webdriver(service=service)
# 2. Geri kalan adımlar aynıdır
driver.maximize_window()
driver.get("https://www.google.com")
# Arama kutusunu bulmak için farklı stratejiler de kullanılabilir (örn. NAME, CSS_SELECTOR, XPATH)
search_box = driver.find_element(By.NAME, "q") # Google'ın arama kutusunun NAME'i "q"
search_box.send_keys("Selenium WebDriver")
search_box.send_keys(Keys.ENTER)
time.sleep(2)
# Sonucun başlığını yazdır
print("Sayfa Başlığı:", driver.title)
driver.quit()

WebDriver'ın Temel Metotları ve Özellikleri

Metot / Özellik Açıklama
driver.get(url) Belirtilen URL'ye tarayıcıyı yönlendirir.
driver.title Mevcut sayfanın başlığını (title) string olarak döndürür.
driver.current_url Mevcut sayfanın URL'sini string olarak döndürür.
driver.page_source Mevcut sayfanın HTML kaynağını string olarak döndürür.
driver.find_element(By, "değer") Sayfada tek bir eleman bulmak için kullanılır. Eğer birden fazla eleman bulursa hata verir.
driver.find_elements(By, "değer") Sayfada birden fazla eleman bulmak için kullanılır. Sonuç olarak bir liste döndürür.
element.click() Belirtilen elemana (örn. buton, link) tıklar.
element.send_keys("metin") Belirtilen elemana (genellikle input/textarea) metin yazar.
element.text Bir elemanın görünen metnini alır. (HTML etiketlerini içermez)
element.get_attribute("attribute_adi") Bir elemanın belirtilen özelliğini (örn. href, src, value) alır.
driver.back() Tarayıcı geçmişinde bir geri atar.
driver.forward() Tarayıcı geçmişinde bir ileri atar.
driver.refresh() Sayfayı yeniler.
driver.maximize_window() Tarayıcı penceresini tam ekran yapar.
driver.quit() WebDriver oturumunu sonlandırır ve tarayıcıyı tamamen kapatır. (En temiz kapanış)
driver.close() Mevcut sekmeyi veya pencereyi kapatır. Birden fazla pencere açtıysanız diğerleri açık kalır.

Elemanları Bulma (Locators)

find_element metodu, bir web elemanını bulmak için kullanılır. By sınıfı, elemanı nasıl bulacağımızı belirten stratejileri içerir.

By Stratejisi Açıklama Örnek
ID Elemanın id attribute'u. Genellikle en hızlı ve en güvenli yöntemdir. By.ID, "user-name"
NAME Elemanın name attribute'u. Form elemanlarında sıkça kullanılır. By.NAME, "password"
CLASS_NAME Elemanın class attribute'u. Dikkat: Birden fazla class olabilir ve bu yöntem ilkini bulabilir. By.CLASS_NAME, "btn-primary"
TAG_NAME HTML etiket adı (örn. div, a, input). Genellikle birden fazla eleman bulmak için kullanılır. By.TAG_NAME, "a"
LINK_TEXT Bir linkin (anchor tag) tam metni. By.LINK_TEXT, "Hesabım"
PARTIAL_LINK_TEXT Bir linkin metninin bir parçası. LINK_TEXT'e göre daha esnektir. By.PARTIAL_LINK_TEXT, "Hesap"
CSS_SELECTOR CSS stilleri için kullanılan seçiciler. Çok güçlü ve esnektir. En çok tercih edilen yöntemlerden biridir. By.CSS_SELECTOR, "#login-button"
XPATH XML Path Language. Bir elemanın dosya sistemindeki yoluna benzer bir yoldur. Çok güçlü ve esnektir, ancak yavaş ve kırılgan olabilir. By.XPATH, "//div[@id='login-form']/input[1]"

Modern Yaklaşım: Implicit ve Explicit Waits (Beklemeler)

Web sayfaları yüklenirken bazen elemanlar hemen görünmeyebilir. time.sleep() sabit bir bekleme yapar ve kodu yavaşlatabilir. Bunun yerine akıllı bekleme stratejileri kullanmak daha iyidir.

Implicit Wait (Örtük Bekleme)

Driver'ı bulmaya çalışırken bir eleman bulunamazsa, belirli bir süre kadar beklemesini söyler. Bu bekleme, tüm find_element çağrıları için geçerlidir.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# 10 saniye boyunca eleman bulunamazsa her seferinde 500ms aralıklarla dener
driver.implicitly_wait(10)
driver.get("https://some-slow-website.com")
# Eğer bu eleman 5 saniyede görünürse, kod 5 saniye sonra devam eder.
# 10 saniyede de görünmezse hata fırlatır.
element = driver.find_element(By.ID, "slow-element")

Explicit Wait (Açık Bekleme) (Tavsiye Edilen)

Belirli bir koşul gerçekleşene kadar (örn. bir eleman tıklanabilir olana kadar) bekler. WebDriverWait ve expected_conditions ile kullanılır. Her bekleme için ayrı tanımlandığı için daha güvenilirdir.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://some-slow-website.com")
# En fazla 10 saniye bekle, ID'si "myDynamicElement" olan eleman
# görünür hale gelene kadar. Koşul sağlandığında elemanı döndürür.
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
    # Artık eleman kullanılabilir
    element.click()
finally:
    driver.quit()

expected_conditions kütüphanesinde element_to_be_clickable, visibility_of_element_located, title_contains gibi çok sayıda kullanışlı koşul bulunur.


Özetle Nasıl Başlanır?

  1. Kurulum: pip install selenium ve pip install webdriver-manager.
  2. Driver Başlatma: webdriver-manager kullanarak driver = webdriver.Chrome() gibi basit bir kodla başlatın.
  3. Sayfaya Gitme: driver.get("https://...").
  4. Eleman Bulma: By.ID, By.CSS_SELECTOR veya By.XPATH gibi güvenli bir strateji kullanarak eleman bulun.
  5. İşlem Yapma: click(), send_keys() gibi metotlarla etkileşime geçin.
  6. Bekleme Stratejisi: time.sleep() yerine WebDriverWait kullanın.
  7. Temizlik: İşiniz bittiğinde driver.quit() ile tarayıcıyı kapatın.
分享:
扫描分享到社交APP
上一篇
下一篇