Hinweis: Dieses Projekt entzieht sich von der Selen -Syntax
Dokumentation
CDP-Patches (nur Kopffrüchte) sollten dies beheben
(wird es irgendwann integrieren)
Fühlen Sie sich frei, sich der fahrerlosen Gemeinschaft auf Zwietracht anzuschließen :)
Siehe Dev-Branch für die neuesten Implementierungen.
pip uninstall -y selenium-driverless
pip install https://github.com/kaliiiiiiiiii/Selenium-Driverless/archive/refs/heads/dev.zipDieses Projekt wird derzeit nicht gesponsert.
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 ())Asynkifiziert werden Fehler erwarten
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 )HINWEIS: Asyncio wird empfohlen, und Threading funktioniert nur in unabhängigen Webdriver.chrome -Instanzen.
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 ausführen, ohne erkannt zu werden (in einer isolierten Welt ) 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 ())Siehe @Master/Tests/show_mousemove.py zur Visualisierung
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 ) fällig swtich_to.frame() die für fahrerlos veraltet sind, verwenden Sie dies stattdessen
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 ())Sie können eine benutzerdefinierte Ausnahmebehandlung implementieren wie folgt
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 Sie haben einen Fehler gefunden? Fühlen Sie sich frei, ein Problem zu öffnen :) Sie haben andere Fragen oder Vorlagen? Fühlen Sie sich frei, sich der fahrerlosen Gemeinschaft auf Zwietracht anzuschließen oder eine Diskusion zu öffnen
Aurin Aegerter (auch bekannt als Steve )
Diese Arbeit ist im Rahmen einer Creative Commons Attribution-Noncommercial-sharealike 4.0 Internationaler Lizenz mit einer Ergänzung für Section 1(k) im Rechtskodex lizenziert:
Gewerbliche Mittelwerte, die hauptsächlich für kommerzielle Vorteile oder finanzielle Entschädigung vorgesehen sind oder auf sie gerichtet sind.
Ein Unternehmen, ein Projekt oder eine öffentliche Vereinbarung mit einer kommerziellen Absicht jeglicher Art, die mehr als 7'000 US-Dollar pro Monat profitiert oder 5'000 US-Dollar pro Monat oder ein Geld, das dem entspricht, unterliegt dieser Definition von Nichtkommerziellen nicht.
Wenn Sie dieses Projekt kommerziell verwenden möchten, können Sie den Autor für eine benutzerdefinierte Lizenz kontaktieren. Dies beinhaltet in der Regel eine Gebühr von rund 5-6% basierend auf Ihrem aktuellen Gewinn.
Dieses Projekt ist nur für Bildungszwecke gedacht. Verwenden Sie es verantwortungsbewusst.
Der Autor stellt keine Garantie an und haftet in keiner Weise für was oder wie er verwendet wird.
Inspiration, Codeausschnitte usw.