Rumah > pembangunan bahagian belakang > Tutorial Python > Membina Automasi Web Teguh dengan Selenium dan Python

Membina Automasi Web Teguh dengan Selenium dan Python

DDD
Lepaskan: 2025-01-07 00:04:43
asal
672 orang telah melayarinya

Automasi web kini merupakan alat yang sangat diperlukan dalam pembangunan dan pengujian perisian moden. Dalam tutorial Selenium Python yang komprehensif ini, anda akan belajar cara membina rangka kerja automasi web yang teguh yang mampu mengendalikan senario dunia sebenar. Jika anda berminat untuk melaksanakan ujian automatik dalam Python atau mencipta penyelesaian automasi mengikis web yang kompleks, panduan ini akan memberi anda pendekatan yang diuji industri dan amalan terbaik Selenium.

Memahami Asas Automasi Web

Automasi web adalah penting dalam pembangunan perisian moden, ujian dan pengumpulan data. Aplikasinya merangkumi daripada ujian hujung ke hujung aplikasi web kepada memudahkan aliran kerja berulang, seperti penyerahan borang atau pengikisan web. Walaupun penyepaduan Selenium WebDriver Python menawarkan keupayaan yang berkuasa, automasi web yang mantap adalah lebih daripada sekadar menulis skrip untuk meniru interaksi pengguna. Ini mengenai mereka bentuk aliran kerja dan rangka kerja yang boleh diselenggara, boleh disesuaikan dan berdaya tahan terhadap perubahan pada aplikasi web sasaran.

Di bawah ialah aspek utama yang akan kami bincangkan sepanjang tutorial ini:

  • Memilih pencari yang sesuai (XPath, CSS, dll.)
  • Unsur dinamik dan pemuatan keadaan
  • Melaksanakan mekanisme cuba semula
  • Mengurus sesi penyemak imbas dengan betul
  • Struktur kebolehselenggaraan kod

Kami akan membina projek automasi mengikis web untuk penjejak harga di tapak web e-dagang menggunakan Books to Scrape sebagai tapak tunjuk cara untuk menunjukkan konsep ini sambil mematuhi amalan terbaik Selenium.

Prasyarat

Untuk mengikuti tutorial ini, anda memerlukan:

  • Python 3.x dipasang pada mesin anda.
  • Pengetahuan asas pengaturcaraan Python
  • Pengetahuan asas Mengikis Web dengan Selenium

Kod untuk tutorial ini tersedia pada repositori github kami, jangan ragu untuk mengklonkannya untuk diikuti.

Menyediakan Persekitaran Pembangunan

Mari kita sediakan persekitaran pembangunan yang betul dan pasang pakej Python yang diperlukan. Mula-mula, cipta folder projek dan persekitaran maya baharu dengan menjalankan arahan di bawah:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kemudian, cipta dan tambah pakej Python berikut pada fail requirements.txt anda:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kami menentukan kebergantungan teras kami. Pakej selenium menyediakan asas untuk rangka kerja automasi web kami, manakala pengurus pemacu web mengendalikan pengurusan pemacu penyemak imbas secara automatik. Pakej python-dotenv adalah untuk konfigurasi persekitaran dan pakej permintaan adalah untuk pengendalian permintaan HTTP.

Sekarang jalankan arahan di bawah untuk memasang semua pakej Python dalam fail requirements.txt anda dengan menjalankan arahan di bawah:

pip install -r requirements.txt
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Akhir sekali, buat struktur folder berikut untuk projek kami:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Di sini kami mewujudkan struktur projek modular mengikut amalan terbaik kejuruteraan perisian. Direktori teras mengandungi komponen automasi utama kami, manakala pangkalan data mengendalikan kegigihan data.

Membina Alat Penjejak Harga

Dengan persekitaran projek, kebergantungan dan struktur folder yang dicipta, mari teruskan membina alat automasi penjejak harga menggunakan Selenium dan Python.

Melaksanakan Sistem Pengurusan Pelayar kami

Mari laksanakan sistem pengurusan penyemak imbas kami, ini adalah komponen penting untuk penyepaduan Selenium WebDriver Python yang stabil. Tambahkan coretan kod di bawah pada fail teras/browser.py anda:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kod di atas mencipta kelas BrowserManager yang mengendalikan pemulaan dan konfigurasi WebDriver. Kelas melaksanakan amalan terbaik Selenium dengan mengkonfigurasi pilihan Chrome untuk kestabilan dan prestasi. Parameter tanpa kepala membolehkan ujian dijalankan tanpa tetingkap penyemak imbas yang kelihatan, yang penting untuk saluran paip CI/CD.

Sekarang tambahkan kaedah berikut pada kelas BrowserManager untuk melaksanakan ciri pengurusan penyemak imbas teras:

pip install -r requirements.txt
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kaedah start_browser menggunakan webdriver-manager untuk mengendalikan pemasangan dan kemas kini pemacu secara automatik, manakala close_browser memastikan pembersihan sumber yang betul. Pelaksanaan termasuk konfigurasi menunggu tersirat untuk mengendalikan pemuatan halaman dinamik dengan anggun.

Mencipta Pengendali Elemen

Seterusnya, mari kita teruskan untuk melaksanakan sistem interaksi elemen, ini penting dalam mana-mana rangka kerja automasi web kerana ia membolehkan kita mengesan dan berinteraksi dengan elemen dengan cara yang boleh dipercayai sambil mengikuti amalan terbaik Selenium. Tambahkan coretan kod pada core/element_handler.py
anda

price_tracker_automation/
├── core/
│   ├── browser.py
|   ├── scraper.py
│   └── element_handler.py
├── database/
│   └── db_manager.py
├── notifications/
|   └── price_alert.py
├── requirements.txt
├── run.py
└── main.py
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kami mencipta kelas ElementHandler, yang merangkum corak interaksi Selenium WebDriver Python. Kelas menerima contoh WebDriver dan parameter tamat masa boleh dikonfigurasikan.

Kemas kini kelas ElementHandler anda untuk menambah kaedah interaksi unsur teras:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
import logging

class BrowserManager:
    def __init__(self, headless=False):
        self.options = webdriver.ChromeOptions()
        if headless:
            self.options.add_argument('--headless')

        # Add additional stability options
        self.options.add_argument('--no-sandbox')
        self.options.add_argument('--disable-dev-shm-usage')
        self.options.add_argument('--disable-gpu')

        self.driver = None
        self.logger = logging.getLogger(__name__)
Salin selepas log masuk
Salin selepas log masuk

Kaedah di atas menggunakan Selenium's WebDriverWait dan expected_conditions untuk mengesan elemen supaya ia juga boleh mengendalikan halaman web dinamik di mana elemen mungkin dimuatkan secara tidak segerak.

Tambah kaedah lain untuk melaksanakan logik pengekstrakan teks:

    def start_browser(self):
        """Initialize and return a ChromeDriver instance"""
        try:
 service = webdriver.ChromeService()
            self.driver = webdriver.Chrome(service=service, options=self.options)
            self.driver.implicitly_wait(10)
            return self.driver
        except Exception as e:
            self.logger.error(f"Failed to start browser: {str(e)}")
            raise

    def close_browser(self):
        """Safely close the browser"""
        if self.driver:
            self.driver.quit()
            self.driver = None
Salin selepas log masuk
Salin selepas log masuk

Kaedah ini termasuk cuba semula logik untuk mengendalikan StaleElementReferenceException, yang merupakan cabaran biasa dalam automasi web.

Melaksanakan Teras Penjejak Harga

Sekarang mari kita bina fungsi mengikis utama kami, menggabungkan konsep Python ujian automatik dan pengendalian ralat yang mantap. Tambahkan coretan kod di bawah pada fail teras/scraper.py anda:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kami mencipta kelas BookScraper yang menyepadukan pelayar dan komponen pengendalian elemen kami. Kelas mengikuti corak Model Objek Halaman, konsep utama dalam reka bentuk rangka kerja automasi web, dengan memusatkan pencari elemen dan menyediakan API yang bersih untuk operasi mengikis.

Seterusnya, kemas kini kelas BookScraper untuk menambah kaedah pengekstrakan data produk teras:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kaedah di atas menggunakan pendekatan berstruktur untuk mengumpulkan maklumat produk, mengekalkan log terperinci untuk nyahpepijat dan pemantauan.

Menyediakan Pengurusan Pangkalan Data

Mari kita laksanakan lapisan pangkalan data rangka kerja automasi web kami, yang akan mengendalikan penyimpanan berterusan data kami yang dikikis. Komponen ini akan membolehkan kami menjejaki perubahan harga dari semasa ke semasa. Tambahkan coretan kod di bawah pada pangkalan data anda/db_manager.py:

pip install -r requirements.txt
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kami menentukan kelas DatabaseManager kami yang mengendalikan semua operasi pangkalan data. Kami menggunakan SQLite untuk kesederhanaan dan mudah alih, untuk mengelak daripada menyediakan dan mengkonfigurasi pangkalan data dan SQLite juga sesuai untuk projek automasi mengikis web kami kerana kami tidak menyimpan sejumlah besar data.

Seterusnya, kemas kini pangkalan data anda/db_manager.py untuk menambah kaedah permulaan pangkalan data:

price_tracker_automation/
├── core/
│   ├── browser.py
|   ├── scraper.py
│   └── element_handler.py
├── database/
│   └── db_manager.py
├── notifications/
|   └── price_alert.py
├── requirements.txt
├── run.py
└── main.py
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Di sini kami mewujudkan skema pangkalan data kami menggunakan pernyataan SQL DDL dan mencipta jadual berasingan untuk produk dan sejarah harga, dengan perhubungan dan kekangan yang sesuai yang akan membolehkan kami menjejaki harga dan melakukan analisis sejarah pada data yang kami simpan.

Sekarang mari tambah kaedah lain untuk menyimpan data ke pangkalan data:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
import logging

class BrowserManager:
    def __init__(self, headless=False):
        self.options = webdriver.ChromeOptions()
        if headless:
            self.options.add_argument('--headless')

        # Add additional stability options
        self.options.add_argument('--no-sandbox')
        self.options.add_argument('--disable-dev-shm-usage')
        self.options.add_argument('--disable-gpu')

        self.driver = None
        self.logger = logging.getLogger(__name__)
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kami melaksanakan logik ketekunan data menggunakan pertanyaan berparameter untuk menghalang suntikan SQL. Kaedah ini mengendalikan kedua-dua operasi sisipan dan kemas kini menggunakan klausa ON CONFLICT SQLite.

Integrasi Aplikasi Utama

Mari kita gabungkan semuanya dengan kelas aplikasi utama kami, menggabungkan semua elemen pelaksanaan Selenium WebDriver Python kami. Tambahkan coretan kod di bawah pada fail main.py anda:

    def start_browser(self):
        """Initialize and return a ChromeDriver instance"""
        try:
 service = webdriver.ChromeService()
            self.driver = webdriver.Chrome(service=service, options=self.options)
            self.driver.implicitly_wait(10)
            return self.driver
        except Exception as e:
            self.logger.error(f"Failed to start browser: {str(e)}")
            raise

    def close_browser(self):
        """Safely close the browser"""
        if self.driver:
            self.driver.quit()
            self.driver = None
Salin selepas log masuk
Salin selepas log masuk

Dalam kod di atas, kami mencipta kelas PriceTracker utama yang mengatur semua komponen penyelesaian automasi mengikis web kami. Kelas PriceTracker mengikut corak suntikan kebergantungan untuk mengekalkan modulariti dan kebolehujian.

Seterusnya, kemas kini kelas PriceTracker kami untuk menambah kaedah penjejakan teras:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, StaleElementReferenceException

class ElementHandler:
    def __init__(self, driver, timeout=10):
        self.driver = driver
        self.timeout = timeout
Salin selepas log masuk

Di sini kami melaksanakan logik penjejakan produk utama yang mengendalikan pengikisan web dan menyimpan data yang dikikis.

Menjalankan Aplikasi

Mari kita cipta skrip pelaksanaan untuk menjalankan skrip automasi kami. Tambahkan coretan kod berikut pada fail run.py anda:

   def wait_for_element(self, locator, timeout=None):
        """Wait for element with retry mechanism"""
 timeout = timeout or self.timeout
        try:
 element = WebDriverWait(self.driver, timeout).until(
 EC.presence_of_element_located(locator)
 )
            return element
        except TimeoutException:
            raise TimeoutException(f"Element {locator} not found after {timeout} seconds")

    def get_text_safely(self, locator, timeout=None):
        """Safely get text from element with retry mechanism"""
 max_retries = 3
        for attempt in range(max_retries):
            try:
 element = self.wait_for_element(locator, timeout)
                return element.text.strip()
            except StaleElementReferenceException:
                if attempt == max_retries - 1:
                    raise
                continue
Salin selepas log masuk

Sekarang jalankan arahan berikut pada terminal anda untuk menjalankan skrip:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Arahan di atas akan menunjukkan output pada tangkapan skrin di bawah:

Building Robust Web Automation with Selenium and Python

Daripada skrip di atas, anda dapat melihat bahawa skrip automasi kami menjejaki harga untuk semua URL yang ditentukan.

Menjejaki Perubahan Harga

Pelaksanaan semasa kami hanya menjejak dan menjimatkan harga produk. Selepas menjejak harga, mari tingkatkan penjejak harga kami untuk memberitahu pengguna tentang perubahan harga. Tambahkan coretan kod berikut pada fail pemberitahuan/price_alert.py anda:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam coretan kod di atas, kami mencipta kelas PriceAlertManager dengan kebergantungan penting. Pengurus mengambil contoh pengurus pangkalan data sebagai parameter dan menyediakan pengelogan untuk menjejak operasi amaran. Kelas menggunakan gabungan kompleks untuk membandingkan harga semasa dan sebelumnya. Kemudian kami melaksanakan pengiraan peratusan perubahan harga yang dinamik dan mencipta kamus berstruktur untuk maklumat perubahan harga.

Seterusnya, kemas kini kelas PriceAlertManager anda untuk menambah fungsi pemberitahuan e-mel:

pip install -r requirements.txt
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Di sini, kami mencipta pemberitahuan e-mel menggunakan e-mel Python dan perpustakaan SMTP. Pelaksanaan menggunakan kelas MIMEText untuk mencipta mesej e-mel yang diformat dengan betul. Badan e-mel dijana secara dinamik menggunakan f-strings, menggabungkan maklumat perubahan harga terperinci dengan pemformatan mata wang yang tepat.

Sekarang mari kita ubah suai skrip larian kami untuk memasukkan makluman harga:

price_tracker_automation/
├── core/
│   ├── browser.py
|   ├── scraper.py
│   └── element_handler.py
├── database/
│   └── db_manager.py
├── notifications/
|   └── price_alert.py
├── requirements.txt
├── run.py
└── main.py
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kini jika anda menjalankan skrip sekali lagi, ia akan menjejaki harga produk dan memaklumkan anda tentang produk yang harganya telah berubah seperti dalam tangkapan skrin di bawah:

Building Robust Web Automation with Selenium and Python

Mungkin anda boleh menjalankan skrip ini dalam tugas cron untuk menjejaki harga produk dan memaklumkan anda dalam masa nyata tentang perubahan harga tanpa perlu menjalankannya secara manual setiap kali.
Cth. 0 */6 * * * python run.py --urls
"http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
"http://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"
"http://books.toscrape.com/catalogue/soumission_998/index.html"

Kesimpulan

Sepanjang tutorial ini, anda telah mempelajari cara membina alat automasi web yang mantap menggunakan Selenium dan Python. Kami bermula dengan memahami asas automasi web, kemudian kami menyediakan persekitaran pembangunan untuk alat Penjejak Harga yang kami bina untuk demonstrasi dalam tutorial ini. Kemudian kami pergi lebih jauh untuk membina aplikasi Penjejak Harga yang menjejaki harga produk dan memaklumkan pengguna tentang perubahan harga. Sekarang setelah anda mempunyai pengetahuan ini, alat apakah yang akan anda bina seterusnya. Beritahu saya di bahagian komen. Selamat mengekod!

Atas ialah kandungan terperinci Membina Automasi Web Teguh dengan Selenium dan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan