14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# File 'lib/robro/browser.rb', line 14
def initialize(application, headless: false)
@application = application.to_sym
@headless = headless
Capybara.configure do |config|
config.run_server = false
config.default_max_wait_time = 5
end
require 'selenium-webdriver'
Capybara.register_driver :chrome_jack do |app|
options = ::Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless') if headless
options.add_argument('--start-maximized')
options.add_argument('--disable-blink-features')
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--excludeSwitches=enable-automation')
options.add_argument('--disable-gpu')
driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
bridge = driver.browser.send(:bridge)
path = '/session/:session_id/chromium/send_command'
path[':session_id'] = bridge.session_id
javascript = " Object.defineProperty(document, 'visibilityState', {value: 'visible', writable: true});\n Object.defineProperty(document, 'hidden', {value: false, writable: true});\n document.dispatchEvent(new Event(\"visibilitychange\"));\n\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(navigator, {\n has: (target, key) => (key === 'webdriver' ? false : key in target),\n get: (target, key) =>\n key === 'webdriver'\n ? undefined\n : typeof target[key] === 'function'\n ? target[key].bind(target)\n : target[key]\n })\n });\n JAVASCRIPT\n\n bridge.http.call(:post, path, cmd: 'Page.addScriptToEvaluateOnNewDocument',\n params: {\n source: javascript,\n })\n\n driver\n end\n\n Capybara.current_driver = driver\n\n Capybara::Screenshot.register_driver(Capybara.current_driver) do |driver, path|\n driver.browser.save_screenshot(path)\n end\n\n Robro.logger.debug \"Browser User-Agent: '\#{page.execute_script 'return navigator.userAgent'}'\"\n\n Robro.logger.debug \"Capybara driver: \#{Capybara.current_driver} (application: \#{application}, headless: \#{headless?})\"\nend\n"
|