import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import time
def checkLinkedIn[command]:
url = f"//www.linkedin.com/in/{command}"
path = "C:\Program Files [x86]\chromedriver.exe"
options = Options[]
options.add_argument["--headless"]
driver = webdriver.Chrome[path, options=options]
driver.get[url]
soup = BeautifulSoup[driver.page_source, 'html.parser']
time.sleep[2]
driver.quit[]
name = soup.find["h2", attrs={"class": "top-card-layout__title"}]
if name:
print["LinkedIn profile found"]
print[url]
else:
print["No LinkedIn profile found"]
def checkTwitter[command]:
url = f"//www.twitter.com/{command}"
path = "C:\Program Files [x86]\chromedriver.exe"
options = Options[]
options.add_argument["--headless"]
driver = webdriver.Chrome[path, options=options]
driver.get[url]
soup = BeautifulSoup[driver.page_source, 'html.parser']
time.sleep[2]
driver.quit[]
at_tag = soup.find["div", attrs={"dir": "ltr"}]
print[soup.text]
if at_tag:
print["Twitter profile found"]
print[url]
else:
print["No Twitter profile found"]
usrname = input["--> "]
checkTwitter[usrname]
Hàm LinkedIn hoạt động. Tuy nhiên, Twitter đưa ra điều này:
JavaScript không có sẵn. Chúng tôi đã phát hiện ra rằng JavaScript bị vô hiệu hóa trong trình duyệt này. Vui lòng bật JavaScript hoặc chuyển sang trình duyệt được hỗ trợ để tiếp tục sử dụng Twitter.com. Bạn có thể thấy một danh sách các trình duyệt được hỗ trợ trong trung tâm trợ giúp của chúng tôi.
Làm cách nào để kích hoạt JavaScript trong một Chrome không đầu? Cảm ơn trước.
Đã hỏi ngày 20 tháng 5 năm 2021 lúc 8:54May 20, 2021 at 8:54
Điều này có thể bởi vì trang web phát hiện nó là một trình duyệt không đầu và vô hiệu hóa một số tính năng.
Để vượt qua nó, bạn có thể giả mạo [càng nhiều càng tốt] danh tính của trình duyệt không đầu để lừa trang web.
Hãy thử các tùy chọn sau:
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
Điều này làm việc cho tôi với một trang web bướng bỉnh cụ thể. Các tùy chọn tôi đã thu thập được từ nhiều câu trả lời nhưng đặc biệt là cái này: //stackoverflow.com/a/53040904/5339857
Đã trả lời ngày 2 tháng 12 năm 2021 lúc 14:54Dec 2, 2021 at 14:54
Roy Shilkroy ShilkrotRoy Shilkrot
2.47926 Huy hiệu bạc22 Huy hiệu đồng26 silver badges22 bronze badges
sử dụng
options.add_argument["--enable-javascript"]
Đã trả lời ngày 20 tháng 5 năm 2021 lúc 8:55May 20, 2021 at 8:55
CruisepandeycruisePandeycruisepandey
Phim thương hiệu vàng 27,7K66 gold badges18 silver badges37 bronze badges
Trở lại vào tháng Tư, Google đã thông báo rằng họ sẽ vận chuyển Chrome không đầu trong Chrome 59. Vì các lá cờ tương ứng đã có sẵn trên Chrome Canary, nhóm Duo Labs nghĩ rằng sẽ rất vui khi kiểm tra mọi thứ và cũng giới thiệu ngắn gọn về việc lái xe Chrome Sử dụng selen và python.
Tự động hóa trình duyệt
Trước khi chúng tôi đi sâu vào bất kỳ mã nào, hãy để nói về trình duyệt không đầu là gì và tại sao nó lại hữu ích. Nói tóm lại, các trình duyệt không đầu là trình duyệt web không có giao diện người dùng đồ họa [GUI] và thường được kiểm soát theo chương trình hoặc thông qua giao diện dòng lệnh.
Một trong nhiều trường hợp sử dụng cho các trình duyệt không đầu là tự động hóa việc kiểm tra khả năng sử dụng hoặc kiểm tra các tương tác trình duyệt. Nếu bạn đang cố gắng kiểm tra cách một trang có thể hiển thị trong một trình duyệt khác hoặc xác nhận rằng các yếu tố trang có mặt sau khi người dùng bắt đầu một quy trình công việc nhất định, sử dụng trình duyệt không đầu có thể cung cấp rất nhiều hỗ trợ. Ngoài ra, các tác vụ định hướng web truyền thống như cạo web có thể khó thực hiện nếu nội dung được hiển thị động [giả sử, thông qua JavaScript]. Sử dụng trình duyệt không đầu cho phép dễ dàng truy cập vào nội dung này vì nội dung được hiển thị chính xác như trong trình duyệt đầy đủ.
Thời đại đen tối
Trước khi phát hành Chrome không đầu, bất cứ lúc nào bạn thực hiện bất kỳ việc lái xe tự động nào có khả năng liên quan đến một số cửa sổ hoặc tab, bạn phải lo lắng về việc sử dụng CPU và/hoặc bộ nhớ. Cả hai đều được liên kết với việc phải hiển thị trình duyệt với đồ họa được hiển thị từ URL được yêu cầu.
Khi sử dụng trình duyệt không đầu, chúng tôi không phải lo lắng về điều đó. Do đó, chúng ta có thể mong đợi chi phí bộ nhớ thấp hơn và thực hiện nhanh hơn cho các tập lệnh mà chúng ta viết.
Đi không đầu
Thành lập
Trước khi chúng tôi bắt đầu, chúng tôi cần cài đặt Chrome Canary và tải xuống Chromedriver mới nhất [hiện là 5,29].
Tiếp theo, hãy để Lôi tạo một thư mục sẽ chứa tất cả các tệp của chúng tôi:
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
2Bây giờ chúng ta có thể chuyển Chromedriver vào thư mục mà chúng ta vừa thực hiện:
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
3Vì chúng tôi đang sử dụng selenium với Python, nên bạn nên tạo ra một môi trường ảo Python. Tôi sử dụng VirtualEnv, vì vậy nếu bạn sử dụng một trình quản lý môi trường ảo khác, các lệnh có thể khác nhau.
$ cd going_headless && virtualenv -p python3 env
$ source env/bin/activate
Điều tiếp theo chúng ta cần làm là cài đặt selen. Nếu bạn không quen thuộc với Selenium, thì đó là một bộ công cụ cho phép các nhà phát triển lập trình trình bày các trình duyệt web. Nó có các ràng buộc ngôn ngữ cho Java, C#, Ruby, JavaScript [Nút] và Python. Để cài đặt gói selenium cho Python, chúng tôi có thể chạy như sau:
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
4Thí dụ
Bây giờ chúng tôi đã nhận được tất cả những điều đó, hãy để Lừa đến phần thú vị. Mục tiêu của chúng tôi là viết một kịch bản tìm kiếm tên của tôi là Ol Ol Olabode trên Duo.com và kiểm tra xem một bài viết gần đây tôi đã viết về Android Security được liệt kê trong kết quả. Nếu bạn đã làm theo các hướng dẫn ở trên, bạn có thể sử dụng phiên bản không đầu của Chrome Canary với Selenium như vậy:
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
chrome_options = Options[]
chrome_options.add_argument["--headless"]
chrome_options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'`
driver = webdriver.Chrome[executable_path=os.path.abspath[“chromedriver"], chrome_options=chrome_options]
driver.get["//www.duo.com"]`
magnifying_glass = driver.find_element_by_id["js-open-icon"]
if magnifying_glass.is_displayed[]:
magnifying_glass.click[]
else:
menu_button = driver.find_element_by_css_selector[".menu-trigger.local"]
menu_button.click[]`
search_field = driver.find_element_by_id["site-search"]
search_field.clear[]
search_field.send_keys["Olabode"]
search_field.send_keys[Keys.RETURN]
assert "Looking Back at Android Security in 2016" in driver.page_source driver.close[]`
Ví dụ giải thích
Hãy cùng phá vỡ những gì mà xảy ra trong kịch bản. Chúng tôi bắt đầu bằng cách nhập các mô -đun cần thiết.
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
5 cung cấp các phím trong bàn phím như from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
6, v.v.import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
Tiếp theo, chúng tôi tạo một đối tượng Chromeoptions cho phép chúng tôi đặt vị trí của nhị phân Chrome mà chúng tôi muốn sử dụng và cũng vượt qua đối số không đầu. Nếu bạn để lại đối số không đầu, bạn sẽ thấy cửa sổ trình duyệt bật lên và tìm kiếm tên của tôi.
Ngoài ra, nếu bạn không đặt vị trí nhị phân thành vị trí của Chrome Canary trên hệ thống của bạn, phiên bản hiện tại của Google Chrome được cài đặt sẽ được sử dụng. Tôi đã viết hướng dẫn này trên máy Mac, nhưng bạn có thể tìm thấy vị trí của tệp trên các nền tảng khác ở đây. Bạn chỉ cần thay thế Chrome cho Chrome Canary trong các đường dẫn tệp tương ứng.
chrome_options = Options[]
chrome_options.add_argument["--headless"]
chrome_options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
driver = webdriver.Chrome[executable_path=os.path.abspath[“chromedriver"], chrome_options=chrome_options]
Chức năng trình điều khiển sẽ được sử dụng điều hướng đến URL được chỉ định.
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
7Trang web Duo.com có phản hồi, vì vậy chúng tôi phải xử lý các điều kiện khác nhau. Do đó, chúng tôi kiểm tra xem nút tìm kiếm dự kiến có được hiển thị không. Nếu đó là một trò chơi, chúng tôi nhấp vào nút menu để nhập thuật ngữ tìm kiếm của chúng tôi.
magnifying_glass = driver.find_element_by_id["js-open-icon"]
if magnifying_glass.is_displayed[]:
magnifying_glass.click[]
else:
menu_button = driver.find_element_by_css_selector[".menu-trigger.local"]
menu_button.click[]
Bây giờ chúng tôi xóa trường tìm kiếm, tìm kiếm tên của tôi và gửi phím trả lại cho ổ đĩa.
search_field = driver.find_element_by_id["site-search"]
search_field.clear[]
search_field.send_keys["Olabode"]
search_field.send_keys[Keys.RETURN]
Chúng tôi kiểm tra để đảm bảo rằng tiêu đề bài đăng trên blog từ một trong những bài đăng gần đây nhất của tôi là trong nguồn trang.
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
8Và cuối cùng, chúng tôi đóng trình duyệt.
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
9Điểm chuẩn
Đi đến đầu không đầu
Vì vậy, thật tuyệt khi bây giờ chúng ta có thể kiểm soát Chrome bằng Selenium và Python mà không cần phải xem cửa sổ trình duyệt, nhưng chúng tôi quan tâm nhiều hơn đến những lợi ích hiệu suất mà chúng tôi đã nói trước đó. Sử dụng cùng một kịch bản ở trên, chúng tôi đã định cấu hình thời gian để hoàn thành các tác vụ, sử dụng bộ nhớ cao điểm và tỷ lệ phần trăm CPU. Chúng tôi đã bỏ phiếu CPU và sử dụng bộ nhớ với PSUTIL và đo thời gian hoàn thành nhiệm vụ bằng thời gian sử dụng thời gian.
Thời gian trung bình | 5,29 giây | 5,51 giây |
Sử dụng bộ nhớ trung bình | 25,3 mib | 25,47 MIB |
Tỷ lệ phần trăm CPU trung bình | 1,92% | 2,02% |
Đối với kịch bản nhỏ của chúng tôi, có sự khác biệt rất nhỏ về lượng thời gian được thực hiện để hoàn thành nhiệm vụ [4,3%], sử dụng bộ nhớ [.5%] và tỷ lệ phần trăm CPU [5,2%]. Mặc dù những lợi ích trong ví dụ của chúng tôi là rất tối thiểu, những lợi ích này sẽ chứng minh là có lợi trong một bộ thử nghiệm với hàng tá bài kiểm tra.
Hướng dẫn sử dụng so với Adhoc
Trong tập lệnh ở trên, chúng tôi bắt đầu quá trình máy chủ Chromedriver khi chúng tôi tạo đối tượng WebDriver và nó bị chấm dứt khi chúng tôi gọi QUIT []. Đối với một kịch bản một lần, đó không phải là một vấn đề, nhưng điều này có thể lãng phí một lượng thời gian không cần thiết cho một bộ thử nghiệm lớn tạo ra một phiên bản màu sắc cho mỗi thử nghiệm. May mắn thay, chúng ta có thể tự khởi động và tự dừng máy chủ và nó chỉ yêu cầu một vài thay đổi đối với tập lệnh ở trên.
Ví dụ đoạn trích
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
service = webdriver.chrome.service.Service[os.path.abspath[“chromedriver"]]
service.start[]
chrome_options = Options[]
chrome_options.add_argument["--headless"]
# path to the binary of Chrome Canary that we installed earlier
chrome_options.binary_location = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'
driver = webdriver.Remote[service.service_url, desired_capabilities=chrome_options.to_capabilities[]]
Snippet giải thích
Mặc dù chỉ có ba dòng mã đã thay đổi, nhưng hãy để nói về những gì mà xảy ra trong đó. Để kiểm soát thủ công máy chủ Chromedriver, chúng tôi phải sử dụng crômedriverservice. Chúng tôi làm như vậy bằng cách tạo một đối tượng dịch vụ với đường dẫn đến Chromedriver và sau đó chúng tôi có thể bắt đầu dịch vụ.
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
0Điều cuối cùng chúng ta phải làm là tạo một webdriver có thể kết nối với một máy chủ từ xa. Để sử dụng Chrome Canary và phần không đầu, chúng ta phải vượt qua từ điển của tất cả các tùy chọn vì đối tượng WebDriver từ xa không chấp nhận một đối tượng tùy chọn.
from fake_useragent import UserAgent
options = webdriver.ChromeOptions[]
options.add_argument['--headless']
options.add_argument["--incognito"]
options.add_argument["--nogpu"]
options.add_argument["--disable-gpu"]
options.add_argument["--window-size=1280,1280"]
options.add_argument["--no-sandbox"]
options.add_argument["--enable-javascript"]
options.add_experimental_option["excludeSwitches", ["enable-automation"]]
options.add_experimental_option['useAutomationExtension', False]
options.add_argument['--disable-blink-features=AutomationControlled']
ua = UserAgent[]
userAgent = ua.random
driver = webdriver.Chrome[options=options]
driver.execute_script["Object.defineProperty[navigator, 'webdriver', {get: [] => undefined}]"]
driver.execute_cdp_cmd['Network.setUserAgentOverride', {"userAgent": userAgent}]
1Tiền thưởng
Bằng cách thêm thủ công bắt đầu dịch vụ, chúng tôi đã thấy tốc độ dự kiến tăng lên. Thời gian trung bình cho trình duyệt không đầu và đầu để hoàn thành các nhiệm vụ trong kịch bản giảm 11% [4,72 giây] và tương ứng 4% [5,29 giây].
Thời gian trung bình [% giảm] | 4% | 11% |
Thời gian trung bình [giây] | 5,29 giây | 4,72 giây |
Các kết thúc
Việc phát hành Chrome không đầu đã được chờ đợi từ lâu. Và với thông báo rằng người tạo ra Phantomjs đang từ chức một người bảo trì, chúng tôi tin tưởng mạnh mẽ rằng Chrome không đầu là tương lai của các trình duyệt không đầu.
Mặc dù chúng tôi đã đề cập đến selen trong hướng dẫn này, nhưng điều đáng nói là API Chrome Devtools có thể là một tài nguyên hữu ích nếu bạn đang thực hiện bất kỳ loại hồ sơ nào hoặc cần tạo các trang PDF mà bạn truy cập. Chúng tôi hy vọng điều này sẽ giúp bạn bắt đầu sử dụng phiên bản Chrome không đầu cho dù bạn đang thực hiện bất kỳ loại thử nghiệm QA nào hay đang tự động hóa tất cả các nhiệm vụ liên quan đến web hàng ngày của bạn.
Tài nguyên
GitHub repo
Liên kết Chrome
- Canary chrome
- Trình điều khiển Chrome
- API Chrome Devtools
Liên kết selen
- Selenium HQ
- Gói Selenium Python