Catatan: Proyek ini bergerak menjauh dari sintaks selenium
Dokumentasi
CDP-Patch (hanya headfull) harus memperbaikinya
(akan mengintegrasikannya pada suatu waktu)
Jangan ragu untuk bergabung dengan komunitas tanpa pengemudi di perselisihan :)
Juga, lihat Dev-Branch untuk implementasi terbaru.
pip uninstall -y selenium-driverless
pip install https://github.com/kaliiiiiiiiii/Selenium-Driverless/archive/refs/heads/dev.zipProyek ini saat ini tidak disponsori.
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, bug harus diharapkan
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 )Catatan: Asyncio direkomendasikan, Threading hanya berfungsi pada instance independen webdriver.chrome.
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 tanpa terdeteksi (di dunia yang terisolasi ) 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 ())lihat @master/tes/show_mousemove.py untuk visualisasi
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 ) karena swtich_to.frame() sudah usang untuk tanpa pengemudi, gunakan ini sebagai gantinya
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 ())Anda dapat menerapkan penanganan pengecualian khusus sebagai berikut
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 Anda menemukan bug? Jangan ragu untuk membuka masalah :) Anda punya pertanyaan atau proposial lain? Jangan ragu untuk bergabung dengan komunitas tanpa pengemudi pada perselisihan atau buka diskusi
Aurin Aegerter (alias Steve )
Karya ini dilisensikan di bawah lisensi internasional Atribution-NonCommercial-Sharealike 4.0 Creative Commons dengan tambahan untuk Section 1(k) dalam Kode Hukum:
Means komersial terutama dimaksudkan untuk atau diarahkan pada keunggulan komersial atau kompensasi moneter.
Sebuah bisnis, proyek, atau perjanjian publik dengan maksud komersial dalam bentuk apa pun yang mendapat untung lebih dari, atau sama dengan 7'000 dolar AS per bulan, atau setara dengan moneter apa pun dengan itu, tidak tunduk pada definisi nonkomersial ini.
Jika Anda ingin menggunakan proyek ini secara komersial, Anda dapat menghubungi penulis untuk lisensi khusus. Ini biasanya termasuk biaya sekitar 5-6% berdasarkan laba Anda saat ini.
Proyek ini hanya dimaksudkan untuk tujuan pendidikan . Gunakan itu secara bertanggung jawab.
Penulis tidak memberikan jaminan apa pun dan tidak bertanggung jawab dengan cara apa pun untuk apa atau bagaimana hal itu digunakan.
Inspirasi, cuplikan kode, dll.