ملاحظة: هذا المشروع يبتعد عن بناء جملة السيلينيوم
الوثائق
يجب أن تقوم CDP-Patches (Headfull فقط) بإصلاح هذا
(سوف يدمجها في وقت ما)
لا تتردد في الانضمام إلى مجتمع السائق على الخلاف :)
أيضًا ، انظر 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 ())غير متزامن ، يجب أن تتوقع الأخطاء
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.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 دون اكتشاف (في عالم معزول ) 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 هل وجدت خطأ؟ لا تتردد في فتح مشكلة :) هل لديك أسئلة أو مقترحات أخرى؟ لا تتردد في الانضمام إلى المجتمع بدون سائق على الخلاف أو فتح سخر
Aurin Aegerter (المعروف أيضًا باسم ستيف )
تم ترخيص هذا العمل بموجب رخصة إبداعية لاتخاذ الإسناد المشترك-ترخيص دولي 4.0 دوليًا مع إضافة Section 1(k) في القانون القانوني:
الوسائل التجارية المخصصة في المقام الأول أو توجيهها نحو الميزة التجارية أو التعويض النقدي.
لا يخضع شركة الأعمال أو المشروع أو الاتفاقية العامة مع نية تجارية من أي نوع تستفيد أكثر من 7'000 دولار أمريكي شهريًا ، أو أي ما يعادلها النقدي ، هذا التعريف غير التجاري.
إذا كنت ترغب في استخدام هذا المشروع تجاريًا ، فيمكنك الاتصال بالمؤلف للحصول على ترخيص مخصص. يتضمن هذا عادةً رسومًا تبلغ حوالي 5-6 ٪ بناءً على ربحك الحالي.
هذا المشروع مخصص للأغراض التعليمية فقط . استخدمه بمسؤولية.
لا يقدم المؤلف أي ضمان ولا يتحمل المسؤولية بأي طريقة أو كيف يتم استخدامه.
إلهام ، قصاصات رمز ، إلخ.