Page 14 of 32

Re: Rufaydium WebDriver 1.6.3 (no selenium/websocket)

Posted: 13 Jul 2022, 01:24
by Xeo786
pAnDeLa wrote:
13 Jul 2022, 01:12
pAnDeLa wrote:
12 Jul 2022, 14:47
I see there are functions for dragging and dropping web elements, but is it possible to simulate dropping a file onto a droppable webpage element or file input element, via Rufaydium?
You can check web-driver actions or Rufaydium's Session.Actions() actually I am planning to write action class to make this stuff easy.
Oh nice thx, those are great resources! And I should've read the Rufaydium docs more though lol,
drag and drop simulation/substitution can also be done with:

Code: Select all

;simulate drag and drop file via file input element
filelocation := "C:\Users\username\Pictures\image.png" ;set file path
UploadFile := Page.querySelectorAll(".chatEntry input[name=fileupload")[0] ;select file input element
UploadFile.Sendkey(StrReplace(filelocation,"\","/")) ;if Element is input element then file location can be set using SendKey()
Yeah, I know that. Some web pages have draggable elements I thought you were asking for that :D

Re: Rufaydium WebDriver 1.6.3 (no selenium/websocket)

Posted: 13 Jul 2022, 07:00
by pAnDeLa
pAnDeLa wrote:
06 Jul 2022, 20:49

Thanks for getting back, I did a lot of digging and was able to find a flag that actually logs js console messages!
That flag being --webview-log-js-console-messages. While the method you posted into getting the browser log is great and yields far more detailed information, I have a quick solution as well :D The chrome_debug.log file generated by chrome is deleted every time you reopen chrome too. If I recall you must use the Default or current Chrome Profile in Rufaydium as well.

Here's a working example of js callbacks in Rufaydium & Chrome, thanks again for this amazing library 8-)

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#Include Rufaydium.ahk
#SingleInstance,Force


if (A_Args.Length() = 0) {
	Run, "C:\Program Files\AutoHotkey\AutoHotkeyU64.exe" %A_ScriptFullPath% 1
	ExitApp
}


Chrome_Log := new CLogTailer("C:\Users\uername\AppData\Local\Google\Chrome\User Data\chrome_debug.log", Func("ReadLog"))
ReadLog(Console_Output){
	;ToolTip % "New line added @ " A_TickCount ": " text
	if RegExMatch(Console_Output,"hello world!") { 
		msgbox, Houston we have lift off!
		gosub, DoStuff
	}
}

/*
	Load "chromedriver.exe" from "A_ScriptDir"
	In case Driver is not yet available, it will Download "chromedriver.exe" into "A_ScriptDir"
	before starting the Driver.
*/

ChromeInst := new Rufaydium("chromedriver.exe", "--port=9515")
ChromeInst.capabilities.setUserProfile("Default") ;use Default chrome profile
ChromeInst.capabilities.addArg(" --enable-logging ") ;enable chrome_debug.log file
ChromeInst.capabilities.addArg(" --v=0 ") ;needed for above logging flag to work
ChromeInst.capabilities.addArg(" --webview-log-js-console-messages ") ;this undocumented flag is the peace de la resistance we need for js/console to ahk callbacks to work

/*
	Create new session if WebBrowser Version Matches the Webdriver Version.
	It will ask to download the compatible WebDriver if not present.
*/

Page := ChromeInst.NewSession()
;Page := ChromeInst.NewSession("C:\Program Files\Google\Chrome\Application\chrome.exe")
;Page.CDP.call("Console.enable") ;not needed in this case
Page.Navigate("https://www.autohotkey.com/docs/AutoHotkey.htm") ; navigate to url
sleep, 1000

gosub, InjectJS
return

DoStuff:
Settings := Page.getElementsByClassName("settings")[0] ;open settings page
Settings.Click()
msgbox, We did stuff!
return


;https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
;https://www.autohotkey.com/boards/viewtopic.php?style=17&p=306235#p306235
InjectJS:
JS_MutationObserver =
(
function init() {
  if (window.MutationObserver) {
    startMutationObserver();
  } else {
    startMutationEvents();
  }
}

function startMutationObserver() {
  // target node to be observed
  var target = document.querySelector('body');
  // mutation observer config object with the listeners configuration
  var config = listenOnlyAttributeChanges();

  // mutation observer instantiation
  var mutationObs = new MutationObserver(callbackAttributeChange);

  // observe initialization
  mutationObs.observe(target, config);
}

function listenOnlyAttributeChanges() {
  return {
    attributes: true,
    childList: true,
    subtree: true
  };
}

function callbackAttributeChange(mutations, mutationObs) {
  for (var i = 0, length = mutations.length; i < length; i++) {
    var mutation = mutations[i];
    if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
      var target = mutation.target;
      console.log(target.id + target.style.display);
      console.log("---" + target.id + target.class);
	 
	 //test
	 console.log("hello world!");
    }
  }
}

var addedNodes = 0;
var colorpage = false;
init();
)

;Inject Mutation Observer
Page.CDP.Evaluate(JS_MutationObserver)
return


F12::
ChromeInst.QuitAllSessions() ; close all session 
ChromeInst.Driver.Exit() ; then exits driver
Process,Close,chromedriver.exe ;force closer driver
ExitApp


;https://www.autohotkey.com/boards/viewtopic.php?t=47894#p215692
class CLogTailer {
	__New(logfile, callback){
		this.file := FileOpen(logfile, "r-d")
		this.callback := callback
		; Move seek to end of file
		this.file.Seek(0, 2)
		fn := this.WatchLog.Bind(this)
		SetTimer, % fn, 100
	}
	
	WatchLog(){
		Loop {
			p := this.file.Tell()
			l := this.file.Length
			line := this.file.ReadLine(), "`r`n"
			len := StrLen(line)
			if (len){
				RegExMatch(line, "[\r\n]+", matches)
				if (line == matches)
					continue
				this.callback.Call(Trim(line, "`r`n"))
			}
		} until (p == l)
	}
}
If you want to do this in headless mode, you'll need the flags:

Code: Select all

ChromeInst.capabilities.addArg(" --window-size=1920,1080 ")
ChromeInst.capabilities.addArg(" --start-maximized ")
ChromeInst.capabilities.addArg(" --headless ") 
ChromeInst.capabilities.addArg(" --ignore-certificate-errors ")
ChromeInst.capabilities.addArg(" --allow-running-insecure-content ") ;needed for headless
ChromeInst.capabilities.addArg(" --disable-gpu ")
ChromeInst.capabilities.addArg(" --user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36 ")
Its also worth noting that when I used headless mode, the chrome_debug.txt normally located in
C:\Users\username\AppData\Local\Google\Chrome\User Data was now being generated in
C:\Users\username\AppData\Local\Google\Chrome\User Data\Default instead.
Not sure if that is intended behavior or an error on my part, but hopefully that knowledge will save some trouble :p
So yea, be sure to point your CLogTailer() function to the proper chrome_debug.txt log file path in headless mode

Re: Rufaydium WebDriver 1.6.3 (no selenium/websocket)

Posted: 13 Jul 2022, 07:48
by Xeo786
pAnDeLa wrote:
13 Jul 2022, 07:00
pAnDeLa wrote:
06 Jul 2022, 20:49

Thanks for getting back, I did a lot of digging and was able to find a flag that actually logs js console messages!
That flag being --webview-log-js-console-messages. While the method you posted into getting the browser log is great and yields far more detailed information, I have a quick solution as well :D The chrome_debug.log file generated by chrome is deleted every time you reopen chrome too. If I recall you must use the Default or current Chrome Profile in Rufaydium as well.

Here's a working example of js callbacks in Rufaydium & Chrome, thanks again for this amazing library 8-)

Code: Select all

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#Include Rufaydium.ahk
#SingleInstance,Force


if (A_Args.Length() = 0) {
	Run, "C:\Program Files\AutoHotkey\AutoHotkeyU64.exe" %A_ScriptFullPath% 1
	ExitApp
}


Chrome_Log := new CLogTailer("C:\Users\uername\AppData\Local\Google\Chrome\User Data\chrome_debug.log", Func("ReadLog"))
ReadLog(Console_Output){
	;ToolTip % "New line added @ " A_TickCount ": " text
	if RegExMatch(Console_Output,"hello world!") { 
		msgbox, Houston we have lift off!
		gosub, DoStuff
	}
}

/*
	Load "chromedriver.exe" from "A_ScriptDir"
	In case Driver is not yet available, it will Download "chromedriver.exe" into "A_ScriptDir"
	before starting the Driver.
*/

ChromeInst := new Rufaydium("chromedriver.exe", "--port=9515")
ChromeInst.capabilities.setUserProfile("Default") ;use Default chrome profile
ChromeInst.capabilities.addArg(" --enable-logging ") ;enable chrome_debug.log file
ChromeInst.capabilities.addArg(" --v=0 ") ;needed for above logging flag to work
ChromeInst.capabilities.addArg(" --webview-log-js-console-messages ") ;this undocumented flag is the peace de la resistance we need for js/console to ahk callbacks to work

/*
	Create new session if WebBrowser Version Matches the Webdriver Version.
	It will ask to download the compatible WebDriver if not present.
*/

Page := ChromeInst.NewSession()
;Page := ChromeInst.NewSession("C:\Program Files\Google\Chrome\Application\chrome.exe")
;Page.CDP.call("Console.enable") ;not needed in this case
Page.Navigate("https://www.autohotkey.com/docs/AutoHotkey.htm") ; navigate to url
sleep, 1000

gosub, InjectJS
return

DoStuff:
Settings := Page.getElementsByClassName("settings")[0] ;open settings page
Settings.Click()
msgbox, We did stuff!
return


;https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
;https://www.autohotkey.com/boards/viewtopic.php?style=17&p=306235#p306235
InjectJS:
JS_MutationObserver =
(
function init() {
  if (window.MutationObserver) {
    startMutationObserver();
  } else {
    startMutationEvents();
  }
}

function startMutationObserver() {
  // target node to be observed
  var target = document.querySelector('body');
  // mutation observer config object with the listeners configuration
  var config = listenOnlyAttributeChanges();

  // mutation observer instantiation
  var mutationObs = new MutationObserver(callbackAttributeChange);

  // observe initialization
  mutationObs.observe(target, config);
}

function listenOnlyAttributeChanges() {
  return {
    attributes: true,
    childList: true,
    subtree: true
  };
}

function callbackAttributeChange(mutations, mutationObs) {
  for (var i = 0, length = mutations.length; i < length; i++) {
    var mutation = mutations[i];
    if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
      var target = mutation.target;
      console.log(target.id + target.style.display);
      console.log("---" + target.id + target.class);
	 
	 //test
	 console.log("hello world!");
    }
  }
}

var addedNodes = 0;
var colorpage = false;
init();
)

;Inject Mutation Observer
Page.CDP.Evaluate(JS_MutationObserver)
return


F12::
ChromeInst.QuitAllSessions() ; close all session 
ChromeInst.Driver.Exit() ; then exits driver
Process,Close,chromedriver.exe ;force closer driver
ExitApp


;https://www.autohotkey.com/boards/viewtopic.php?t=47894#p215692
class CLogTailer {
	__New(logfile, callback){
		this.file := FileOpen(logfile, "r-d")
		this.callback := callback
		; Move seek to end of file
		this.file.Seek(0, 2)
		fn := this.WatchLog.Bind(this)
		SetTimer, % fn, 100
	}
	
	WatchLog(){
		Loop {
			p := this.file.Tell()
			l := this.file.Length
			line := this.file.ReadLine(), "`r`n"
			len := StrLen(line)
			if (len){
				RegExMatch(line, "[\r\n]+", matches)
				if (line == matches)
					continue
				this.callback.Call(Trim(line, "`r`n"))
			}
		} until (p == l)
	}
}
If you want to do this in headless mode, you'll need the flags:

Code: Select all

ChromeInst.capabilities.addArg(" --window-size=1920,1080 ")
ChromeInst.capabilities.addArg(" --start-maximized ")
ChromeInst.capabilities.addArg(" --headless ") 
ChromeInst.capabilities.addArg(" --ignore-certificate-errors ")
ChromeInst.capabilities.addArg(" --allow-running-insecure-content ") ;needed for headless
ChromeInst.capabilities.addArg(" --disable-gpu ")
ChromeInst.capabilities.addArg(" --user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36 ")
Its also worth noting that when I used headless mode, the chrome_debug.txt normally located in
C:\Users\username\AppData\Local\Google\Chrome\User Data was now being generated in
C:\Users\username\AppData\Local\Google\Chrome\User Data\Default instead.
Not sure if that is intended behavior or an error on my part, but hopefully that knowledge will save some trouble :p
So yea, be sure to point your CLogTailer() function to the proper chrome_debug.txt log file path in headless mode
thanks awsome ...!
btw no spaces on both ends are needed for commandline swicths/args

Code: Select all

ChromeInst.capabilities.addArg("--disable-gpu") ; no space needed

Re: Rufaydium WebDriver 1.6.3 (no selenium/websocket)

Posted: 19 Jul 2022, 08:29
by Xeo786
Just Implemented Action Class, did following test

Code: Select all

#Include, %A_ScriptDir%\..\Rufaydium-Webdriver
#include Rufaydium.ahk 
goto, TestKeyboard
return

clickTest:
URL := "https://quickdraw.withgoogle.com"
page := GetRufaydium(URL) ; run/access  chrome  browser

MouseEvent := new mouse()
;MouseEvent.click(0, 400, 400)
;MouseEvent.click(1, 200, 300)

MouseEvent.press()
MouseEvent.move(288,258,10)
MouseEvent.release()
MouseEvent.press()
MouseEvent.move(391,181,10)
MouseEvent.release()
MouseEvent.press()
MouseEvent.move(493,258,10)
MouseEvent.release()
MouseEvent.press()
MouseEvent.move(454,358,10)
MouseEvent.release()
MouseEvent.press()
MouseEvent.move(328,358,10)
MouseEvent.release()
MouseEvent.press()
MouseEvent.move(288,258,10)
MouseEvent.release()
MouseEvent.press()
MouseEvent.release()
msgbox, move drawing window and click ok to draw
x := page.actions(MouseEvent)
return


ScrollTest:
URL :=  "https://www.autohotkey.com/boards/"
page := GetRufaydium(URL) ; run/access  chrome  browser
WheelEvent := new Scroll()
return

down::
page.scrollDown()
return

up::
page.scrollup()
return

TestKeyboard:
URL :=  "https://www.autohotkey.com/boards/"
page := GetRufaydium(URL) ; run/access  chrome  browser
e := Page.querySelector("#keywords")
e.focus()
page.sendkey("aBcd")
page.sendkey("xyZ")
return

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 19 Jul 2022, 09:21
by hotcheesesoup
@Xeo786
Very cool! I'll have to check this out. The site we use at work has hidden fields that require injecting a JSON object, so it's really a pain to automate them. Maybe sending keystrokes instead would get around that limitation.

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 19 Jul 2022, 09:42
by Xeo786
hotcheesesoup wrote:
19 Jul 2022, 09:21
@Xeo786
Very cool! I'll have to check this out. The site we use at work has hidden fields that require injecting a JSON object, so it's really a pain to automate them. Maybe sending keystrokes instead would get around that limitation.
It was complicated to create case-sensitive/proper/overcomplicated JSON object. It took to so much time to find the correct JSON parameters/formations.
Now we have Action.ahk to simplifies JSON objects creation.
Spoiler
You can take multiple events i.e.

Code: Select all

Page.Actions(MouseEvent, KeyboardEvent, ScrollEvent, Mouse2Event) ; can add more / will be triggered from left to right
I am curious what kind of JSON object you are sending, if you have any suggestion feel free.

Edit: fixed mistake in code

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 19 Jul 2022, 11:14
by hotcheesesoup
@Xeo786
Here's an example of the JSON payload I'm injecting into a hidden "ClientState" field. Typically the value of the hidden field doesn't even show up until you focus the Input field and physically type text into it.

Code: Select all

				
hiddenValue = {"logEntries":[],"value":"15","text":"Pending","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
Session.CDP.Evaluate("document.getElementById('ctl00_Detail_ApplicationStatus_Input').value = 'Pending'")
Session.CDP.Evaluate("document.getElementById('ctl00_Detail_ApplicationStatus_ClientState').value = '" hiddenValue "'")
This works for most of the hidden fields, but sometimes it is easier to just focus the Input field and send simulated keystrokes then hit Tab a few times to make it trigger the hidden ClientState value.

The old version of our program didn't do any data validation until you submitted, and didn't require the JSON payload, so you could edit fields without even being in Edit mode, etc.

I will give the new stuff a shot when I have a chance and report back!

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 20 Jul 2022, 02:03
by Xeo786
hotcheesesoup wrote:
19 Jul 2022, 11:14
@Xeo786
Here's an example of the JSON payload I'm injecting into a hidden "ClientState" field. Typically the value of the hidden field doesn't even show up until you focus on the Input field and physically type text into it.

Code: Select all

				
hiddenValue = {"logEntries":[],"value":"15","text":"Pending","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
Session.CDP.Evaluate("document.getElementById('ctl00_Detail_ApplicationStatus_Input').value = 'Pending'")
Session.CDP.Evaluate("document.getElementById('ctl00_Detail_ApplicationStatus_ClientState').value = '" hiddenValue "'")
This works for most of the hidden fields, but sometimes it is easier to just focus the Input field and send simulated keystrokes then hit Tab a few times to make it trigger the hidden ClientState value.

The old version of our program didn't do any data validation until you submitted and didn't require the JSON payload, so you could edit fields without even being in Edit mode, etc.

I will give the new stuff a shot when I have a chance and report back!
No need to use CDP, You can use page.ExecuteSync(JS) to execute any JS and Element.execute(JS) evaluate JS on page but you can access element pointer as arguments[0] please look into WDElements.ahk for examples, now WDElements class can have much control over elements, i.e. you can use .focus(), change .innetText, .id, .class, .Title, .Name, .innerHTML, .outerHTML and any attribute/ property using .Execute()

Can you please try these and share the results

Code: Select all

hiddenValue = {"logEntries":[],"value":"15","text":"Pending","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
e := Page.getElementById("ctl00_Detail_ApplicationStatus_Input")
e.focus()

; tests
e.value := hiddenValue ; try setting simply
e.value := json.load(hiddenValue) ; try setting json Object you can also do/use ":=" >> e.value := {"logEntries".....
e.execute("arguments[0].value = '" hiddenValue "'") ; execute JS on element and element pointer will be 'arguments[0]'
; no need for CDP rufaydium Basic manipulate element 
Page.ExecuteSync("document.getElementById('ctl00_Detail_ApplicationStatus_ClientState').value = '" hiddenValue "'")

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 20 Jul 2022, 02:18
by pAnDeLa
Is this possible in Rufaydium too?
I'm able to connect to an already opened Chromium browser via Chrome.ahk using this simple script, but am uncertain how to do the same in Rufaydium

Code: Select all

#Include Chrome.ahk ; https://github.com/G33kDude/Chrome.ahk
Chrome := {"base": Chrome, "DebugPort": 8080} 
TabInst := Chrome.GetPage()
TabInst.Evaluate("alert('Hello World!');")

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 20 Jul 2022, 08:17
by Xeo786
pAnDeLa wrote:
20 Jul 2022, 02:18
Is this possible in Rufaydium too?
I'm able to connect to an already opened Chromium browser via Chrome.ahk using this simple script, but am uncertain how to do the same in Rufaydium

Code: Select all

#Include Chrome.ahk ; https://github.com/G33kDude/Chrome.ahk
Chrome := {"base": Chrome, "DebugPort": 8080} 
TabInst := Chrome.GetPage()
TabInst.Evaluate("alert('Hello World!');")
You can Access Browser Session created using Webdriver only, just like Chrome.ahk, which needs chrome to run in debugging mode
Following function is a good example for getting page once created using webdriver

Code: Select all

Page := GetRufaydium("https://github.com/G33kDude/Chrome.ahk")
Msgbox, % Page.Title "`n" Page.URL  "`n`n run this code again to acces same page `n`n Press f12 to quit Page and driver"
return

f12::
Chrome := new Rufaydium() 
Chrome.QuitAllSessions() ; close all session 
Chrome.Driver.Exit() ; then exits driver
msgbox, all session closed and Driver Exitted
return

; GetRufaydium(URL) gets existing session  
; stops us creatting multiple sessions again and again 
; make sure do not manually close driver / chrome.driver.exit()
; by Xeo786
GetRufaydium(URL)
{
	; get chrome driver / runs chrome driver if not running, download driver if available in A_ScriptDir
	; Run Chrome Driver with default parameters and loads deafult capabilities
	Chrome := new Rufaydium() 
	Page := Chrome.getSessionByUrl(URL) ; check page (created by driver) if already exist 
	if !isobject(page) ; checcking if Session with url exist
	{
		Page := Chrome.getSession(1,1) ; try getting first session first tab
		if isobject(page) ; if exist 
			Page.NewTab() ; create new tab instead new session
		else ; if does not exist 
			Page := Chrome.NewSession() ; create new session ; Page.Exit() if any session manually closed by user which causes lag
		Page.Navigate(URL) ; navigate		
	}
	return page 
}

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 21 Jul 2022, 07:55
by adrian_9832
Can I hide the chrome browser like run in background

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 21 Jul 2022, 08:28
by Xeo786
adrian_9832 wrote:
21 Jul 2022, 07:55
Can I hide the chrome browser like run in background
you need to run chrome in headlessmode

example

Code: Select all

#include Rufaydium.ahk 
Chrome := new Rufaydium() 
Chrome.Capabilities.HeadlessMode := true
Page := Chrome.NewSession()
Page.url := "https://www.autohotkey.com/boards"

Msgbox, % Page.Title "`n" Page.URL  "`n`n Press f12 to quit Page and driver"
return
f12::
Chrome := new Rufaydium() 
Chrome.QuitAllSessions() ; close all session 
Chrome.Driver.Exit() ; then exits driver
msgbox, all session closed and Driver Exitted
return

Re: Rufaydium WebDriver 1.6.3 (no selenium/websocket)

Posted: 22 Jul 2022, 19:20
by noslined
I didn't get this code to work:

Code: Select all

#Include, %A_ScriptDir%\..\Rufaydium-Webdriver
#include Rufaydium.ahk 

URL :=  "https://www.autohotkey.com/boards/"
page := Navigate(URL) ; run/access  chrome  browser
WheelEvent := new Scroll()
page.scrollDown()
return
Also didn't understood about that GetRufaydium, is it a new function or just an example? Couldn't find it.

I also would love if you give me an example to Send a key to the page, not an element, like an Arrow Down, PageUp, etc. I'm not sure if is possible with this new Action Class, tried following your example, but also didn't work.

Thank you! Your library is amazing and is helping a lot everyday

Re: Rufaydium WebDriver 1.6.3 (no selenium/websocket)

Posted: 23 Jul 2022, 01:19
by Xeo786
noslined wrote:
22 Jul 2022, 19:20
I didn't get this code to work:

Code: Select all

#Include, %A_ScriptDir%\..\Rufaydium-Webdriver
#include Rufaydium.ahk 

URL :=  "https://www.autohotkey.com/boards/"
page := Navigate(URL) ; run/access  chrome  browser
WheelEvent := new Scroll()
page.scrollDown()
return
Also didn't understood about that GetRufaydium, is it a new function or just an example? Couldn't find it.

I also would love if you give me an example to Send a key to the page, not an element, like an Arrow Down, PageUp, etc. I'm not sure if is possible with this new Action Class, tried following your example, but also didn't work.

Thank you! Your library is amazing and is helping a lot everyday
Please Read Documentation how to use Rufaydium

1) Rufaydium uses webdriver, it can download/load various webdrive by creating New Rufaydium("DriverName") instance, reference

1.1) it is optional, you can use capabilities to invoke specific browser options like incognito mode, etc.

2) After Creating New Rufaydium instance you need to Run Browser/create Page, by using NewSession() Method,

2.2 You can also access already create Rufaydium session by using various methods see this

Now you are ready to automate Browser using various Session methods,

Code: Select all

#include Rufaydium.ahk 
Chrome := new Rufaydium()  ; first you need to load driver here we are loading Chrome driver 
Page := Chrome.NewSession() ; then we need to create session, Session will open chrome page 
Page.url := "https://www.autohotkey.com/boards" ; same as Page.Navigate(URL)  this is how we navigate to page script will wait till page fully loaded
page.scrollDown()  ; then we scroll down ..... 

;you can also use scroll event which actually doing what 'page.scrollDown()'  just did 
WheelEvent := new Scroll() 
WheelEvent.ScrollDown(s)
Page.Actions(WheelEvent)
return


f12::
Chrome := new Rufaydium() 
Chrome.QuitAllSessions() ; close all session 
Chrome.Driver.Exit() ; then exits driver
msgbox, all session closed and Driver Exitted
return

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 25 Jul 2022, 10:16
by 1apsalman1
hello. Is there a way to control the chrome browser that is already turned on? I wrote the script like this, but it doesn't get the Title.

Code: Select all

Chrome := new Rufaydium("chromedriver.exe")
Page := Chrome.getSessionByURL("https://www.autohotkey.com/boards/viewtopic.php?f=6&t=102616&hilit=rufaydium")
Msgbox, % Page.Title

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 25 Jul 2022, 14:00
by ahk7
Try

Code: Select all

url:="https://www.autohotkey.com/boards/viewtopic.php?f=6&t=102616&hilit=rufaydium"

Browser:=new Rufaydium()
Page:=Browser.NewSession()
Page.Navigate(url)
Session:=Browser.getSessionByUrl(url)
Msgbox, % Session.Title

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 26 Jul 2022, 15:57
by 1apsalman1
That script opens new browser, is there any way to control which browser is already openned?

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 27 Jul 2022, 00:33
by Xeo786
1apsalman1 wrote:
26 Jul 2022, 15:57
That script opens new browser, is there any way to control which browser is already openned?
No, you can't. Normally running Browser is not a Webdriver Session.

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 27 Jul 2022, 13:09
by usafer
My apologies, but I've back with same problem.
What I have:
* Chrome 103, updating showing the last version. Does 64-bit fine?
* Win11, 64 bit
* Manually downloaded and putted cromedriver for chrome 103. I've put it to \chromedriver_win32\file.ahk folder

Whats wrong:
If I use

Code: Select all

Chrome := new Rufaydium() ; default will load driver
Page := Chrome.NewSession()
Page.Navigate("https://www.autohotkey.com/")
return

f12::
Chrome.QuitAllSessions() ; close all session 
Chrome.Driver.Exit() ; then exits driver
return
- no any visible effect, but I see an activity in processes dispetch

Using this:

Code: Select all

#include Rufaydium.ahk 
Chrome := new Rufaydium()  ; first you need to load driver here we are loading Chrome driver 
Page := Chrome.NewSession() ; then we need to create session, Session will open chrome page 
Page.url := "https://www.autohotkey.com/boards" ; same as Page.Navigate(URL)  this is how we navigate to page script will wait till page fully loaded
page.scrollDown()  ; then we scroll down ..... 

;you can also use scroll event which actually doing what 'page.scrollDown()'  just did 
WheelEvent := new Scroll() 
WheelEvent.ScrollDown(s)
Page.Actions(WheelEvent)
return

f12::
Chrome := new Rufaydium() 
Chrome.QuitAllSessions() ; close all session 
Chrome.Driver.Exit() ; then exits driver
msgbox, all session closed and Driver Exitted
return
...I see an error as in attached image.

What I do wrong?

Re: Rufaydium WebDriver 1.7.0 (no selenium/websocket)

Posted: 27 Jul 2022, 13:23
by murataygun
Can i wait user to click a specified button and than continue?