551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
|
# File 'lib/adspower-client.rb', line 551
def driver2(id, headless: false, read_timeout: 180)
if @@drivers[id]
begin
@@drivers[id].window_handles
return @@drivers[id]
rescue Selenium::WebDriver::Error::InvalidSessionIdError,
Selenium::WebDriver::Error::NoSuchWindowError,
Errno::ECONNREFUSED => e
self.class.cleanup(id)
rescue => e
self.class.cleanup(id)
end
end
data = start(id, headless)['data']
ws = data['ws']['selenium']
opts = Selenium::WebDriver::Chrome::Options.new
opts.debugger_address = ws
opts.add_argument('--headless') if headless
http = Selenium::WebDriver::Remote::Http::Default.new
http.read_timeout = read_timeout
driver = Selenium::WebDriver.for(:chrome, options: opts, http_client: http)
driver.execute_cdp(
'Page.addScriptToEvaluateOnNewDocument',
source: " // 1) remove any leftover cdc_\u2026 / webdriver hooks\n for (const k of Object.getOwnPropertyNames(window)) {\n if (k.startsWith('cdc_') || k.includes('webdriver')) {\n try { delete window[k]; } catch(e){}\n }\n }\n\n // 2) stub out window.chrome so Chrome-based detection thinks this is \u201Cnormal\u201D Chrome\n window.chrome = { runtime: {} };\n JS\n )\n\n @@drivers[id] = driver\n driver\nend\n"
|