หมายเหตุ: โครงการนี้ย้ายออกจากไวยากรณ์ซีลีเนียม
เอกสาร
CDP-patches (หัวหัวเท่านั้น) ควรแก้ไขปัญหานี้
(จะรวมเข้าด้วยกันในบางครั้ง)
อย่าลังเลที่จะเข้าร่วมชุมชนที่ไม่มีคนขับใน Discord :)
นอกจากนี้ดูที่ Dev-Branch สำหรับการใช้งานล่าสุด
pip uninstall -y selenium-driverless
pip install https://github.com/kaliiiiiiiiii/Selenium-Driverless/archive/refs/heads/dev.zipโครงการนี้ไม่ได้รับการสนับสนุน
pip install selenium-driverless from selenium_driverless import webdriver
from selenium_driverless . types . by import By
import asyncio
async def main ():
options = webdriver . ChromeOptions ()
async with webdriver . Chrome ( options = options ) as driver :
await driver . get ( 'http://nowsecure.nl#relax' , wait_load = True )
await driver . sleep ( 0.5 )
await driver . wait_for_cdp ( "Page.domContentEventFired" , timeout = 15 )
# wait 10s for elem to exist
elem = await driver . find_element ( By . XPATH , '/html/body/div[2]/div/main/p[2]/a' , timeout = 10 )
await elem . click ( move_to = True )
alert = await driver . switch_to . alert
print ( alert . text )
await alert . accept ()
print ( await driver . title )
asyncio . run ( main ())Asyncified ข้อบกพร่องจะคาดหวัง
from selenium_driverless . sync import webdriver
options = webdriver . ChromeOptions ()
with webdriver . Chrome ( options = options ) as driver :
driver . get ( 'http://nowsecure.nl#relax' )
driver . sleep ( 0.5 )
driver . wait_for_cdp ( "Page.domContentEventFired" , timeout = 15 )
title = driver . title
url = driver . current_url
source = driver . page_source
print ( title ) from selenium_driverless import webdriver
options = webdriver . ChromeOptions ()
options . debugger_address = "127.0.0.1:2005"
# specify if you don't want to run remote
# options.add_argument("--remote-debugging-port=2005")
async with webdriver . Chrome ( options = options ) as driver :
await driver . get ( 'http://nowsecure.nl#relax' , wait_load = True )หมายเหตุ: แนะนำให้ใช้ Asyncio, เธรดทำงานบน WebDriver อิสระเท่านั้นอินสแตนซ์อินสแตนซ์
from selenium_driverless . sync import webdriver
from selenium_driverless . utils . utils import read
from selenium_driverless import webdriver
import asyncio
async def target_1_handler ( target ):
await target . get ( 'https://abrahamjuliot.github.io/creepjs/' )
print ( await target . title )
async def target_2_handler ( target ):
await target . get ( "about:blank" )
await target . execute_script ( await script = read ( "/files/js/show_mousemove.js" ))
await target . pointer . move_to ( 500 , 500 , total_time = 2 )
async def main ():
options = webdriver . ChromeOptions ()
async with webdriver . Chrome ( options = options ) as driver :
target_1 = await driver . current_target
target_2 = await driver . new_window ( "tab" , activate = False )
await asyncio . gather (
target_1_handler ( target_1 ),
target_2_handler ( target_2 )
)
await target_1 . focus ()
input ( "press ENTER to exit" )
asyncio . run ( main ())javascript โดยไม่ถูกตรวจพบ (ใน โลกที่แยกได้ ) from selenium_driverless . sync import webdriver
from selenium_driverless import webdriver
import asyncio
async def main ():
options = webdriver . ChromeOptions ()
async with webdriver . Chrome ( options = options ) as driver :
await driver . get ( 'chrome://version' )
script = """
const proxy = new Proxy(document.documentElement, {
get(target, prop, receiver) {
if(prop === "outerHTML"){
console.log('detected access on "'+prop+'"', receiver)
return "mocked value:)"
}
else{return Reflect.get(...arguments)}
},
});
Object.defineProperty(document, "documentElement", {
value: proxy
})
"""
await driver . execute_script ( script )
src = await driver . execute_script ( "return document.documentElement.outerHTML" , unique_context = True )
mocked = await driver . execute_script ( "return document.documentElement.outerHTML" , unique_context = False )
print ( src , mocked )
asyncio . run ( main ())ดู @master/tests/show_mousemove.py สำหรับการสร้างภาพข้อมูล
pointer = driver . current_pointer
move_kwargs = { "total_time" : 0.7 , "accel" : 2 , "smooth_soft" : 20 }
await pointer . move_to ( 100 , 500 )
await pointer . click ( 500 , 50 , move_kwargs = move_kwargs , move_to = True ) เนื่องจาก swtich_to.frame() ถูกเลิกใช้สำหรับคนขับรถใช้แทน
iframes = await driver . find_elements ( By . TAG_NAME , "iframe" )
await asyncio . sleep ( 0.5 )
iframe_document = await iframes [ 0 ]. content_document
# iframe_document.find_elements(...) from selenium_driverless import webdriver
options = webdriver . ChromeOptions ()
# recommended usage
options . update_pref ( "download.prompt_for_download" , False )
# or
options . prefs . update ({ "download" : { "prompt_for_download" : False }})
# supported
options . add_experimental_option ( "prefs" , { "download.prompt_for_download" : False }) from selenium_driverless import webdriver
import asyncio
async def main ():
options = webdriver . ChromeOptions ()
async with webdriver . Chrome ( options = options ) as driver :
context_1 = driver . current_context
await driver . set_auth ( "username" , "password" , "localhost:5000" )
# proxy not supported on windows due to https://bugs.chromium.org/p/chromium/issues/detail?id=1310057
context_2 = await driver . new_context ( proxy_bypass_list = [ "localhost" ], proxy_server = "http://localhost:5000" )
await context_1 . current_target . get ( "https://examle.com" )
await context_2 . get ( "https://examle.com" )
input ( "press ENTER to exit:)" )
asyncio . run ( main ())คุณสามารถใช้การจัดการข้อยกเว้นที่กำหนดเองดังต่อไปนี้
import selenium_driverless
import sys
handler = ( lambda e : print ( f'Exception in event-handler: n { e . __class__ . __module__ } . { e . __class__ . __name__ } : { e } ' ,
file = sys . stderr ))
sys . modules [ "selenium_driverless" ]. EXC_HANDLER = handler
sys . modules [ "cdp_socket" ]. EXC_HANDLER = handler คุณพบข้อผิดพลาด? อย่าลังเลที่จะเปิดปัญหา :) คุณมีคำถามอื่น ๆ หรือข้อเสนอ? อย่าลังเลที่จะเข้าร่วมชุมชนที่ไม่มีคนขับใน Discord หรือเปิด discusion
Aurin Aegerter (aka Steve )
งานนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต International Creative Commons-Noncommercial-Shareike 4.0 International โดยมี ส่วนเพิ่มเติมสำหรับ Section 1(k) ในรหัสทางกฎหมาย:
เชิงพาณิชย์หมายถึงจุดประสงค์หลักสำหรับหรือมุ่งไปสู่ความได้เปรียบทางการค้าหรือค่าตอบแทนทางการเงิน
ธุรกิจโครงการหรือข้อตกลงสาธารณะด้วยความตั้งใจเชิงพาณิชย์ทุกชนิดที่ทำกำไรได้มากกว่าหรือเท่ากับ 7'000 สหรัฐต่อเดือนต่อเดือนหรือเทียบเท่าทางการเงินใด ๆ
หากคุณต้องการใช้โครงการนี้ในเชิงพาณิชย์คุณสามารถติดต่อผู้เขียนเพื่อขอใบอนุญาตที่กำหนดเอง ซึ่งมักจะมีค่าธรรมเนียมประมาณ 5-6% ตามกำไรปัจจุบันของคุณ
โครงการนี้มีวัตถุประสงค์เพื่อ การศึกษาเท่านั้น ใช้อย่างรับผิดชอบ
ผู้เขียน ไม่ได้ให้การรับประกันใด ๆ และ ไม่รับผิดชอบ ใด ๆ ในทางใดหรือวิธีการใช้งาน
แรงบันดาลใจตัวอย่างโค้ด ฯลฯ