Примечание: этот проект уходит от синтаксиса селена
Документация
Упадки CDP (только для головы) должны исправить это
(будет интегрировать его в какое -то время)
Не стесняйтесь присоединиться к сообщению без водителя в 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 ())Асинцифицированы, ошибки должны ожидать
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 Вы нашли ошибку? Не стесняйтесь открывать проблему :) У вас есть другие вопросы или предложения? Не стесняйтесь присоединиться к сообщению без водителя в отношении Discord или открыть дискуссию
Aurin Aegerter (он же Стив )
Эта работа лицензирована в рамках международной лицензии Creative Commons Attribution-Noncommercial-Sharealike 4.0 с дополнением к Section 1(k) в юридическом кодексе:
Коммерческие средства, в основном предназначенные для или направленные на коммерческое преимущество или денежно -кредитную компенсацию.
Бизнес, проект или государственное соглашение с коммерческими намерениями, которое получает больше, чем или равное 7 000 долларов США в месяц, или любым денежным эквивалентом этого, не подлежит этому определению некоммерческого.
Если вы хотите использовать этот проект в коммерческих целях, вы можете связаться с автором за пользовательскую лицензию. Обычно это включает в себя плату в размере около 5-6% в зависимости от вашей текущей прибыли.
Этот проект предназначен только для образовательных целей . Используйте это ответственно.
Автор не обеспечивает никакой гарантии и не несет никакой ответственности за то, что или как он используется.
Вдохновение, фрагменты кода и т. Д.