lib/pwn/plugins/transparent_browser.rb in pwn-0.5.189 vs lib/pwn/plugins/transparent_browser.rb in pwn-0.5.190

- old
+ new

@@ -39,11 +39,12 @@ # Supported Method Parameters:: # browser_obj1 = PWN::Plugins::TransparentBrowser.open( # browser_type: 'optional - :firefox|:chrome|:headless|:rest|:websocket (defaults to :chrome)', # proxy: 'optional - scheme://proxy_host:port || tor (defaults to nil)', - # with_devtools: 'optional - boolean (defaults to true)' + # with_devtools: 'optional - boolean (defaults to true)', + # url: 'optional - URL to navigate to after opening browser (Defaults to about:about#RANDID)' # ) public_class_method def self.open(opts = {}) browser_type = opts[:browser_type] ||= :chrome proxy = opts[:proxy].to_s unless opts[:proxy].nil? @@ -60,10 +61,12 @@ devtools_supported = %i[chrome headless_chrome firefox headless_firefox headless] with_devtools = opts[:with_devtools] ||= false with_devtools = true if devtools_supported.include?(browser_type) && with_devtools + url = opts[:url] ||= "about:about##{SecureRandom.hex(8)}" + # Let's crank up the default timeout from 30 seconds to 15 min for slow sites Watir.default_timeout = 900 args = [] args.push('--start-maximized') @@ -284,10 +287,11 @@ end if devtools_supported.include?(browser_type) rand_tab = SecureRandom.hex(8) browser_obj[:browser].goto("about:about##{rand_tab}") + browser_obj[:browser].execute_script("document.title = '#{rand_tab}'") if with_devtools driver = browser_obj[:browser].driver browser_obj[:devtools] = driver.devtools @@ -305,11 +309,11 @@ browser_obj[:devtools].send_cmd('DOMSnapshot.enable') end browser_obj[:bidi] = driver.bidi - browser_obj[:browser].body.send_keys(:escape) + browser_obj[:browser].send_keys(:escape) end end browser_obj rescue StandardError => e @@ -495,13 +499,13 @@ if url.nil? browser.goto("about:about##{rand_tab}") browser.execute_script("document.title = '#{rand_tab}'") end # Open the DevTools for Firefox, Chrome opens them automatically - browser.body.send_keys(:f12) if firefox_types.include?(browser_type) + browser.send_keys(:f12) if firefox_types.include?(browser_type) # Open Console drawer if DevTools are open - browser.body.send_keys(:escape) unless devtools.nil? + browser.send_keys(:escape) unless devtools.nil? browser.goto(url) unless url.nil? { title: browser.title, url: browser.url, state: :active } rescue StandardError => e raise e @@ -520,15 +524,17 @@ keyword = opts[:keyword] raise 'ERROR: keyword parameter is required' if keyword.nil? browser = browser_obj[:browser] # Switch to an inactive tab before closing the active tab if it's currently active - active_tab = list_tabs(browser_obj: browser_obj).select { |tab| tab[:state] == :active } - if active_tab.last[:url] == browser.url - inactive_tabs = list_tabs(browser_obj: browser_obj).reject { |tab| tab[:url] == browser.url } - keyword = inactive_tabs.last[:url] - jmp_tab(browser_obj: browser_obj, keyword: keyword) + active_tab = list_tabs(browser_obj: browser_obj).find { |tab| tab[:state] == :active } + if active_tab[:url] == browser.url + inactive_tabs = list_tabs(browser_obj: browser_obj).reject { |tab| tab[:state] == :active } + if inactive_tabs.any? + keyword = inactive_tabs.last[:url] + jmp_tab(browser_obj: browser_obj, keyword: keyword) + end end all_tabs = browser.windows tab_sel = all_tabs.select { |tab| tab.close if tab.title.include?(keyword) || tab.url.include?(keyword) } { title: tab_sel.last.title, url: tab_sel.last.url, state: :closed } if tab_sel.any? rescue StandardError => e @@ -645,11 +651,11 @@ public_class_method def self.toggle_devtools(opts = {}) browser_obj = opts[:browser_obj] verify_devtools_browser(browser_obj: browser_obj) browser = browser_obj[:browser] - browser.body.send_keys(:f12) + browser.send_keys(:f12) rescue StandardError => e raise e end # Supported Method Parameters:: @@ -689,11 +695,11 @@ else raise 'ERROR: panel parameter must be :elements|:inspector|:console|:debugger|:sources|:network' end # Have to call twice for Chrome, otherwise devtools stays closed - browser.body.send_keys(hotkey) - browser.body.send_keys(hotkey) if chrome_types.include?(browser_type) + browser.send_keys(hotkey) + browser.send_keys(hotkey) if chrome_types.include?(browser_type) rescue StandardError => e raise e end # Supported Method Parameters::