Cách chờ trang tải bằng Selenium

How Wait Page Load With Selenium



Trong khi tự động hóa web hoặc quét web với trình điều khiển web Selenium, bạn có thể gặp phải các vấn đề như phần tử bạn muốn chọn không khả dụng hoặc nút bạn muốn nhấn chưa sẵn sàng để nhấp, v.v.

Lý do điều này xảy ra là trình điều khiển web Selenium phải tải xuống trang web và hoàn tất việc hiển thị trang trước khi bạn có thể thực hiện bất kỳ điều gì trên đó. Trước đây, máy chủ web tạo ra nội dung của một trang web và trình duyệt chỉ cần tải xuống và hiển thị nội dung đó. Ngày nay, chúng tôi có nhiều ứng dụng web một trang hoạt động hơi khác một chút. Trong Ứng dụng web một trang (SPA), máy chủ web chỉ cung cấp mã giao diện người dùng. Khi mã giao diện người dùng được hiển thị trên trình duyệt, mã giao diện người dùng sử dụng AJAX để yêu cầu dữ liệu API tới máy chủ web. Khi giao diện người dùng nhận được dữ liệu API, nó sẽ hiển thị chúng trên trình duyệt. Vì vậy, mặc dù trình duyệt đã tải xong và hiển thị trang web nhưng trang web vẫn chưa sẵn sàng. Bạn phải đợi nó nhận dữ liệu API và kết xuất chúng. Vì vậy, giải pháp cho vấn đề này là đợi dữ liệu có sẵn trước khi chúng ta làm bất cứ điều gì với Selenium.







Trong Selenium, có 2 loại chờ đợi:
1) Chờ đợi ngầm
2) Chờ đợi rõ ràng



1) Chờ đợi ngầm: Đây là cách dễ thực hiện nhất. Một sự chờ đợi ngầm cho biết trình điều khiển web Selenium đợi trong vài giây để DOM (mô hình đối tượng tài liệu) sẵn sàng (trang web sẵn sàng).



2) Chờ đợi rõ ràng: Điều này hơi phức tạp hơn một chút so với chờ đợi ngầm. Trong thời gian chờ đợi rõ ràng, bạn cho trình điều khiển web Selenium biết phải đợi gì. Selenium chờ điều kiện cụ thể đó được thực hiện. Sau khi hoàn thành, trình điều khiển web Selenium sẽ sẵn sàng thực hiện các lệnh khác. Thông thường, thời gian chờ rõ ràng có thể thay đổi. Nó phụ thuộc vào mức độ nhanh chóng của các điều kiện được thỏa mãn. Trong trường hợp xấu nhất, sự chờ đợi rõ ràng sẽ đợi bao lâu như sự chờ đợi ngầm.





Trong bài viết này, tôi sẽ chỉ cho bạn cách đợi (ngầm và rõ ràng) để tải một trang bằng Selenium. Vậy hãy bắt đầu.

Điều kiện tiên quyết:

Để thử các lệnh và ví dụ của bài viết này, bạn phải có,



1) Bản phân phối Linux (tốt nhất là Ubuntu) được cài đặt trên máy tính của bạn.
2) Đã cài đặt Python 3 trên máy tính của bạn.
3) PIP 3 được cài đặt trên máy tính của bạn.
4) Python virtualenv gói được cài đặt trên máy tính của bạn.
5) Trình duyệt web Mozilla Firefox hoặc Google Chrome được cài đặt trên máy tính của bạn.
6) Phải biết cách cài đặt Trình điều khiển Firefox Gecko hoặc Trình điều khiển Web Chrome.

Để đáp ứng các yêu cầu 4, 5 và 6, hãy đọc bài viết của tôi Giới thiệu về Selenium với Python 3 tại Linuxhint.com.

Bạn có thể tìm thấy nhiều bài viết về các chủ đề khác trên LinuxHint.com . Hãy chắc chắn kiểm tra chúng nếu bạn cần bất kỳ hỗ trợ nào.

Thiết lập Thư mục Dự án:

Để giữ mọi thứ có tổ chức, hãy tạo một thư mục dự án mới selen-đợi / như sau:

$mkdir -pvselen-đợi/người lái xe

Điều hướng đến selen-đợi / thư mục dự án như sau:

$đĩa CDselen-đợi/

Tạo một môi trường ảo Python trong thư mục dự án như sau:

$virtualenv .venv

Kích hoạt môi trường ảo như sau:

$nguồn.venv//hoạt động

Cài đặt Selenium bằng PIP3 như sau:

$ pip3 cài đặt selen

Tải xuống và cài đặt tất cả trình điều khiển web được yêu cầu trong trình điều khiển / thư mục của dự án. Tôi đã giải thích quá trình tải xuống và cài đặt trình điều khiển web trong bài viết của mình Giới thiệu về Selenium với Python 3 . Nếu bạn cần bất kỳ hỗ trợ nào, hãy tìm kiếm trên LinuxHint.com cho bài báo đó.

Tôi sẽ sử dụng trình duyệt web Google Chrome để trình diễn trong bài viết này. Vì vậy, tôi sẽ sử dụng máy cắt crôm nhị phân từ trình điều khiển / danh mục.

Để thử nghiệm với sự chờ đợi ngầm, hãy tạo một tập lệnh Python mới ex01.py trong thư mục dự án của bạn và nhập các dòng mã sau vào tệp đó.

từselennhập khẩuwebdriver
từselen.webdriver.chung.chìa khóa nhập khẩuChìa khóa
tùy chọn=webdriver.ChromeOptions()
tùy chọn.không đầu = Thật
trình duyệt=webdriver.Trình duyệt Chrome(thực thi_path='./drivers/chromedriver',tùy chọn=tùy chọn)
trình duyệt.implicit_wait(10)
trình duyệt.hiểu được('https://www.unixtimestamp.com/')
dấu thời gian=trình duyệt.find_element_by_xpath('// h3 [@] [1]')
in('Dấu thời gian hiện tại:% s'%(dấu thời gian.chữ.tách ra('')[0]))
trình duyệt.gần()

Khi bạn đã hoàn tất, hãy lưu ex01.py Tập lệnh Python.

Dòng 1 và 2 nhập tất cả các thành phần Selen cần thiết.

Dòng 4 tạo một đối tượng Tùy chọn Chrome.

Dòng 5 bật chế độ không sử dụng cho trình điều khiển web Chrome.

Dòng 7 tạo một đối tượng trình duyệt Chrome bằng cách sử dụng máy cắt crôm nhị phân từ trình điều khiển / danh mục.

Dòng 8 được sử dụng để yêu cầu Selenium chờ ngầm trong 10 giây bằng cách sử dụng implicit_wait () phương pháp trình duyệt.

Dòng 10 tải www.unixtimestamp.com trong trình duyệt.

Dòng 12 tìm phần tử dấu thời gian bằng bộ chọn XPath // h3 [@ class = ’text-risk’] [1] và lưu trữ nó trong dấu thời gian Biến đổi.

Tôi có bộ chọn XPath từ Công cụ dành cho nhà phát triển Chrome. Như bạn có thể thấy, dấu thời gian ở đầu tiên h3 phần tử có tên lớp văn bản nguy hiểm . Có 2 h3 các yếu tố với lớp văn bản nguy hiểm .

Dòng 13 chỉ in dấu thời gian từ phần tử tôi đã chọn bằng cách sử dụng bộ chọn XPath và được lưu trữ trong dấu thời gian Biến đổi.

Dòng 14 đóng trình duyệt.

Khi bạn đã hoàn tất, hãy chạy tập lệnh Python ex01.py như sau:

$ python3 ex01.py

Như bạn có thể thấy, dấu thời gian hiện tại được trích xuất từ ​​unixtimestamp.com và được in trên bảng điều khiển.

Làm việc với Chờ rõ ràng:

Để thử nghiệm với sự chờ đợi rõ ràng, hãy tạo một tập lệnh Python mới ex02.py trong thư mục dự án của bạn và nhập các dòng mã sau vào tệp đó.

từselennhập khẩuwebdriver
từselen.webdriver.chung.chìa khóa nhập khẩuChìa khóa
từselen.webdriver.chung.qua nhập khẩuQua
từselen.webdriver.ủng hộ.củ hành nhập khẩuWebDriverWait
từselen.webdriver.ủng hộ nhập khẩuđiều_kiện_điều_kiện
tùy chọn=webdriver.ChromeOptions()
tùy chọn.không đầu = Thật
trình duyệt=webdriver.Trình duyệt Chrome(thực thi_path='./drivers/chromedriver',tùy chọn=tùy chọn)
trình duyệt.hiểu được('https://www.unixtimestamp.com/')
cố gắng:
dấu thời gian=WebDriverWait(trình duyệt, 10).cho đến khi(
điều_kiện_điều_kiện.sự hiện diện((Qua.XPATH, '
// h3 [@] [1] '
))
)
in('Dấu thời gian hiện tại:% s'%(dấu thời gian.chữ.tách ra('')[0]))
cuối cùng:
trình duyệt.gần()

Khi bạn đã hoàn tất, hãy lưu ex02.py Tập lệnh Python.

Dòng 1-5 nhập tất cả các thành phần bắt buộc từ thư viện Selenium.

Dòng 7 tạo một đối tượng Tùy chọn Chrome.

Dòng 8 bật chế độ không sử dụng cho trình điều khiển web Chrome.

Dòng 10 tạo một đối tượng trình duyệt Chrome bằng cách sử dụng máy cắt crôm nhị phân từ trình điều khiển / danh mục.

Dòng 12 tải www.unixtimestamp.com trong trình duyệt.

Sự chờ đợi rõ ràng được thực hiện trong khối try-last (từ dòng 14-20)

Dòng 15-17 sử dụng tạo WebDriverWait () sự vật. Đối số đầu tiên của WebDriverWait () là đối tượng trình duyệt và đối số thứ hai là thời gian tối đa được phép (trường hợp xấu nhất) để đáp ứng điều kiện, trong trường hợp này là 10 giây.

bên trong cho đến khi() khối, dự kiến_conditions.presence_of_element_located () được sử dụng để đảm bảo rằng phần tử có mặt trước khi cố gắng chọn phần tử. Ở đây, Bởi.XPATH được sử dụng để nói với sự hiện diện_of_element_located () mà chúng tôi đã sử dụng bộ chọn XPath để chọn phần tử. Bộ chọn XPath là // h3 [@ class = ’text-risk’] [1] .

Khi phần tử được tìm thấy, nó được lưu trữ trong dấu thời gian Biến đổi.

Dòng 18 chỉ in dấu thời gian từ phần tử đã chọn.

Cuối cùng, dòng 19-20 đóng trình duyệt.

Khi bạn đã hoàn tất, hãy chạy ex02.py Tập lệnh Python như sau:

$ python3 ex02.py

Như bạn có thể thấy, dấu thời gian hiện tại từ unixtimestamp.com được in trên bảng điều khiển.

Chọn các yếu tố trong Chờ đợi rõ ràng:

Trong phần trước, tôi đã sử dụng Bởi.XPATH để chọn phần tử bằng bộ chọn XPath. Bạn cũng có thể chọn các phần tử bằng cách sử dụng ID, tên thẻ, tên lớp CSS, bộ chọn CSS, v.v.

Các phương pháp lựa chọn được hỗ trợ được đưa ra dưới đây:

Bởi.XPATH - Chọn phần tử / phần tử bằng cách sử dụng bộ chọn XPath.

Bởi.CLASS_NAME - Chọn phần tử / phần tử bằng cách sử dụng tên lớp CSS.

Bởi.CSS_SELECTOR - Chọn phần tử / phần tử bằng cách sử dụng CSS selector.

By.ID - Chọn phần tử theo ID

Bằng tên - Chọn phần tử / phần tử theo tên.

Bởi.TAG_NAME - Chọn phần tử / phần tử theo tên thẻ HTML.

Bởi.LINK_TEXT - Chọn phần tử / phần tử bằng văn bản liên kết của đến (anchor) thẻ HTML.

Bởi.PARTIAL_LINK_TEXT - Chọn phần tử / phần tử bằng văn bản liên kết một phần của đến (anchor) thẻ HTML.

Để biết thêm thông tin về những điều này, hãy truy cập Trang tài liệu về API Selenium của Python .

Điều kiện mong đợi trong thời gian chờ đợi rõ ràng:

Trong ví dụ chờ đợi rõ ràng trước đó, tôi đã sử dụng sự hiện diện_of_element_located () phương pháp của điều_kiện_điều_kiện là điều kiện đợi rõ ràng để đảm bảo rằng phần tử tôi đang tìm kiếm tồn tại trước khi chọn nó.

Có khác điều_kiện_điều_kiện bạn có thể sử dụng như một điều kiện chờ đợi rõ ràng. Một số trong số đó là:

title_is (tiêu đề) - kiểm tra xem tiêu đề của trang là chức vụ .

title_contains (part_title) - kiểm tra xem tiêu đề của trang có chứa một phần của tiêu đề hay không part_title .

khả năng hiển thị (phần tử) - kiểm tra xem yếu tố hiển thị trên trang là phần tử có chiều rộng và chiều cao lớn hơn 0.

Display_of_element_located (bộ định vị) -

hiện diện - Đảm bảo rằng phần tử nằm (bởi máy định vị ) có trên trang. Các máy định vị là một bộ (Bởi, bộ chọn), như tôi đã trình bày trong ví dụ chờ đợi rõ ràng.

present_of_all_element_located () - Đảm bảo rằng tất cả các phần tử phù hợp với máy định vị có mặt trên trang. Các máy định vị là một (Bởi, bộ chọn) tuple.

text_to_be_present_in_element (định vị, văn bản) - Kiểm tra xem chữ hiện diện trong phần tử được định vị bởi máy định vị . Các máy định vị là một (Bởi, bộ chọn) tuple.

element_to_be_clickable (định vị) - Kiểm tra xem phần tử nằm bởi máy định vị có thể nhìn thấy và nhấp được. Các máy định vị là một (Bởi, bộ chọn) tuple.

element_to_be_selected (định vị) - Kiểm tra xem phần tử nằm bởi máy định vị đã được chọn. Các máy định vị là một (Bởi, bộ chọn) tuple.

alert_is_present () - mong đợi một hộp thoại cảnh báo hiện diện trên trang.

Chúng còn nhiều nữa điều_kiện_điều_kiện có sẵn để bạn sử dụng. Để biết thêm thông tin về những điều này, hãy truy cập Trang tài liệu về API Selenium của Python .

Phần kết luận:

Trong bài viết này, tôi đã thảo luận về sự chờ đợi ngầm và rõ ràng của Selenium. Tôi cũng đã chỉ cho bạn cách làm việc với sự chờ đợi ngầm và rõ ràng. Bạn nên luôn cố gắng sử dụng chế độ chờ rõ ràng trong các dự án Selenium của mình vì Selenium sẽ cố gắng giảm thời gian chờ càng nhiều càng tốt. Bằng cách này, bạn sẽ không phải đợi một số giây cụ thể mỗi khi chạy các dự án Selenium của mình. Việc chờ đợi rõ ràng sẽ tiết kiệm rất nhiều giây.

Để biết thêm thông tin về thời gian chờ Selenium, hãy truy cập Thư viện Python Selenium chính thức chờ trang Tài liệu .