Page 3 of 31

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 01:19
by Xeo786
ahk7 wrote:
21 Apr 2022, 12:20
.innertext works, but how do you get the .OuterHTML? Not that I directly need it but would be useful to have to be able to inspect and debug I think (I do see OuterHTML in CDP.ahk)
Yah Rudaydium Basic Session is just act like human interaction with web page. CDP Session Session.CDP.methods can modify Whole DOM

Code: Select all

Session.CDP.Document() ; https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-getDocument
; now we can do getelement from CDP
tables := Session.CDP.querySelectorAll("table")
for i, table in tables
	msgbox, % table.outerhtml ; we can also modify this html using Session.CDP.setOuterHTML(Htmlstring)

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 02:44
by Milchmann
Yah Rudaydium Basic Session is just act like human interaction with web page. CDP Session Session.CDP.methods can modify Whole DOM

Code: Select all

GS.SwitchbyTitle("GitHub - Xeo786/Rufaydium-Webdriver: Rufaydium is Webdriver Library for Autohotket, can support any chromium based browser and only requires Latest WebDriver")

GS.CDP.Document() ; https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-getDocument
; now we can do getelement from CDP

check:= GS.CDP.querySelectorAll("H3")
for i, h3 in check
	msgbox, % h3.outerhtml


:bravo:

Super work, thank you

I still need :
GS.CDP.querySelectorAll("H3").length


Is this possible?

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 02:57
by Xeo786
Milchmann wrote:
22 Apr 2022, 02:44

I still need :
GS.CDP.querySelectorAll("H3").length


Is this possible?

Code: Select all

GS.CDP.querySelectorAll("H3").length() ; this would work

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 03:04
by Xeo786
Tre4shunter wrote:
21 Apr 2022, 10:10
using "--log-PATH=c:\myfile.log --enable-chrome-logs" does work to log the console messages from a web page...but whenever I add those two switches, for some reason it continuously pops up multiple cmd windows for chrome.exe which are blank.

I've not yet figured out how to prevent those cmd windows from appearing wen using the above switches...
according to following link, including these switched in capabilities may create log file
https://peter.sh/experiments/chromium-command-line-switches/#log-file

Code: Select all

	static ChromeLogs =
	( LTrim Join
	{
	"capabilities": {
		"alwaysMatch": {
			"browserName": "chrome",
			"platformName": "windows",
			"goog:chromeOptions": {
				"w3c": json.true,
				"excludeSwitches": ["--log-file=c:\myfile.log","--log-level=0"]
			}
		},
		"firstMatch": [{}]
		},
	"desiredCapabilities": {
		"browserName": "chrome"
		}
	}

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 05:08
by Milchmann
Xeo786 wrote:
22 Apr 2022, 02:57
Milchmann wrote:
22 Apr 2022, 02:44

I still need :
GS.CDP.querySelectorAll("H3").length


Is this possible?

Code: Select all

GS.CDP.querySelectorAll("H3").length() ; this would work
Thank you, works.

Another question. I have several computers where the path changes every time I start and restart the program.


Is there a way to determine the user and then enter this path in static ChromeProfile ?


For example:

Code: Select all

static ChromeProfile =
	( LTrim Join
	{
		"args": ["--user-data-dir=C:/xxx/Profile"],
	}	
or

Code: Select all

static ChromeProfile =
	( LTrim Join
	{
		"args": ["--user-data-dir=C:/yyy/Profile"],
		
	}
Thank you

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 06:16
by Xeo786
Milchmann wrote:
22 Apr 2022, 05:08
Is there a way to determine the user and then enter this path in static ChromeProfile ?

Code: Select all

static ChromeProfile =
	( LTrim Join
	{
		"args": ["--user-data-dir=C:/%a_username%/Profile"],
	}
	)
I think it should be C:/Users/%a_username%/Profile

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 07:02
by thalesduarte
@Xeo786, Do you have any basic example, writing and click at button using that library?
Thanks for the help.

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 07:07
by Xeo786
thalesduarte wrote:
22 Apr 2022, 07:02
@Xeo786, Do you have any basic example, writing and click at button using that library?
Thanks for the help.
https://github.com/hi5/Rufaydium-Webdriver#how-to-use

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 07:47
by thalesduarte
Xeo786 wrote:
22 Apr 2022, 07:07
thalesduarte wrote:
22 Apr 2022, 07:02
@Xeo786, Do you have any basic example, writing and click at button using that library?
Thanks for the help.
https://github.com/hi5/Rufaydium-Webdriver#how-to-use
I'm trying to do like this but dont work :(

Code: Select all

#Include Rufaydium.ahk
; Just need WebDriver Executable location 
ChromeDriver := A_ScriptDir "\chromedriver.exe"
; choose different driver in order to automate different Browser
Driver := new RunDriver(ChromeDriver) ; running driver
Chrome := new Rufaydium(Driver) ; this will return control over Browser

; choosing Browser Capabilities, by using Capabilities Class you can make custom profile for specific need
; Chrome.capabilities := Capabilities.ChromeDefault 

; this is how we create session 
Page := Chrome.NewSession()
Page.Navigate("https://www.autohotkey.com/boards/")

Page := ""
return

f3::
Element := Page.getElementsbyXpath("//*[@id=""keywords""]")
msgbox %Element%
The script open the chrome and website, but dont print keywords when i type in the form and press f3

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 09:31
by Xeo786
thalesduarte wrote:
22 Apr 2022, 07:47
Xeo786 wrote:
22 Apr 2022, 07:07
thalesduarte wrote:
22 Apr 2022, 07:02
@Xeo786, Do you have any basic example, writing and click at button using that library?
Thanks for the help.
https://github.com/hi5/Rufaydium-Webdriver#how-to-use
I'm trying to do like this but dont work :(

Code: Select all

#Include Rufaydium.ahk
; Just need WebDriver Executable location 
ChromeDriver := A_ScriptDir "\chromedriver.exe"
; choose different driver in order to automate different Browser
Driver := new RunDriver(ChromeDriver) ; running driver
Chrome := new Rufaydium(Driver) ; this will return control over Browser

; choosing Browser Capabilities, by using Capabilities Class you can make custom profile for specific need
; Chrome.capabilities := Capabilities.ChromeDefault 

; this is how we create session 
Page := Chrome.NewSession()
Page.Navigate("https://www.autohotkey.com/boards/")

Page := ""
return

f3::
Element := Page.getElementsbyXpath("//*[@id=""keywords""]")
msgbox %Element%
The script open the chrome and website, but dont print keywords when i type in the form and press f3
Element which is return is class object you can try any element.method something like element.value or element.innertext
Getting element with xpath return with element array so

Code: Select all

Elements := Page.getElementsbyXpath("//*[@id=""keywords""]")
For I, element in Elements
     Msgbox % element.innertext

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 12:58
by thalesduarte
Xeo786 wrote:
22 Apr 2022, 09:31
thalesduarte wrote:
22 Apr 2022, 07:47
Xeo786 wrote:
22 Apr 2022, 07:07
thalesduarte wrote:
22 Apr 2022, 07:02
@Xeo786, Do you have any basic example, writing and click at button using that library?
Thanks for the help.
https://github.com/hi5/Rufaydium-Webdriver#how-to-use
I'm trying to do like this but dont work :(

Code: Select all

#Include Rufaydium.ahk
; Just need WebDriver Executable location 
ChromeDriver := A_ScriptDir "\chromedriver.exe"
; choose different driver in order to automate different Browser
Driver := new RunDriver(ChromeDriver) ; running driver
Chrome := new Rufaydium(Driver) ; this will return control over Browser

; choosing Browser Capabilities, by using Capabilities Class you can make custom profile for specific need
; Chrome.capabilities := Capabilities.ChromeDefault 

; this is how we create session 
Page := Chrome.NewSession()
Page.Navigate("https://www.autohotkey.com/boards/")

Page := ""
return

f3::
Element := Page.getElementsbyXpath("//*[@id=""keywords""]")
msgbox %Element%
The script open the chrome and website, but dont print keywords when i type in the form and press f3
Element which is return is class object you can try any element.method something like element.value or element.innertext
Getting element with xpath return with element array so

Code: Select all

Elements := Page.getElementsbyXpath("//*[@id=""keywords""]")
For I, element in Elements
     Msgbox % element.innertext
Dont work, returns blank text box :(

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 14:46
by ahk7
Xeo786 wrote:
22 Apr 2022, 01:19
CDP Session Session.CDP.methods can modify Whole DOM
:thumbup: CDP does the trick.

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 22 Apr 2022, 15:12
by ahk7
thalesduarte wrote:
22 Apr 2022, 12:58
Dont work, returns blank text box :(
1. You clear page:="" in your F1 hotkey so you lose the session there already, that is never going to work
2. I don't think you can get the value of a input before you've submitted it - at least not that I know, if the page has loaded, the value of the keywords input is empty of course. (Not saying it can't be done, but I simply don't know how)

Try this script, it starts chromium and shows a message box, but enter some keywords in the ahk search box first and hit enter to search - THEN press OK, now the msgbox should show they keywords you have entered. For me it does anyway.

Code: Select all

#SingleInstance, force
#Include %A_ScriptDir%\lib
#Include Rufaydium.ahk

ChromeDriver := A_ScriptDir "\chromedriver.exe"

url:="https://www.autohotkey.com/boards/"


; choose different driver in order to automate different Browser
Driver := new RunDriver(ChromeDriver) ; running driver
Chrome := new Rufaydium(Driver) ; this will return control over Browser

; choosing Browser Capabilities, by using Capabilities you can make custom profile for specific need
Chrome.capabilities := Capabilities.ChromeDefault 

; this is how we create session 
Page := Chrome.NewSession()
Page.Navigate(url)

GS := Chrome.getSessionByUrl(url)

MsgBox, Enter keywords, start search, wait for results, press OK

Element := GS.getElementsbyXpath("//*[@id=""keywords""]")

msgbox, % element[1].value

GS:=""
Page := ""

Chrome.QuitAllSessions()
driver.exit()

ExitApp
Alternative method would be to copy it to the clipboard :D

Code: Select all

element:=GS.getElementbyID("keywords")
Element.SendKey(key.ctrl "a")
Element.SendKey(key.ctrl "c")
Sleep 100
MsgBox % clipboard

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 23 Apr 2022, 04:12
by Xeo786
I was testing Session.actions() and I just want to share that piece of code

sketch.io example
Following code will try to select line as pencil and then it will draw Pentagon

Code: Select all

f1::
Chrome := new Rufaydium() ; this will return control over Browser
Chrome.Driver.visible := true ; make Driver CMD window visible 
Page := Chrome.getSessionByUrl("https://sketch.io/sketchpad/") ; try to get if already there
; we can also do getSessionByTitle(title)
if !IsObject(Page) ; checking if page found or not 
{
	Page := Chrome.NewSession() ; creating new session 
	Page.Navigate("https://sketch.io/sketchpad/")
	msgbox, close all messages on sketch.io and press f1 again
	return
}
Page.querySelectorAll("sketch-tool")[3].click() ; click on pencil icon
while !Page.QuerySelectorAll("sketch-gridviewtrigger")[1].displayed() ; wait for menu to get visible using dropdown element visibility 
	sleep, 200
Page.QuerySelectorAll("sketch-gridviewtrigger")[1].click() ; click on dropdown

; looping through types of pencils and selecting "line" 
for i, pencil in Page.QuerySelectorAll("sketch-popoutcontent")[2].QuerySelectorAll("sketch-griditem")
{
	if instr(pencil.innerText,"line")
	{
		pencil.click()
	}
}
while Page.QuerySelectorAll("sketch-gridviewtrigger")[1].displayed()  ; we wait for menu to disappear 
{
	Page.querySelectorAll("sketch-tool")[3].click() ; click will make it disappear so we are clicking, 500 ms delay may be enough
	sleep, 500
}
; defining Actionobject
Pentagon =
( LTrim Join
{
"actions": [
	{
	"type": "pointer",
	"id": "mouse",
	"parameters": {"pointerType": "mouse"},
	"actions": [
		{"type": "pointerDown", "button": 0},
		{"type": "pointerMove", "duration": 10,"x":288, "y":258},
		{"type": "pointerMove", "duration": 10,"x":391, "y":181},
		{"type": "pointerMove", "duration": 10,"x":493, "y":258},
		{"type": "pointerMove", "duration": 10,"x":454, "y":358},
		{"type": "pointerMove", "duration": 10,"x":328, "y":358},
		{"type": "pointerMove", "duration": 10,"x":288, "y":258},
		{"type": "pointerUp", "button": 0}
		]
		}
	]
}
)
page.actions(json.load(Pentagon)) ; initiate actions 
return
Result
Image

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 23 Apr 2022, 08:34
by aifritz
If I have already logged in to a website with my credentials, is there a way to connect to that browser session that is already open?

Many thanks to Xeo786 for this great work! I am deeply impressed :bravo:

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 24 Apr 2022, 23:51
by Xeo786
aifritz wrote:
23 Apr 2022, 08:34
If I have already logged in to a website with my credentials, is there a way to connect to that browser session that is already open?
If you have logged into a website that is opened without webdriver you cannot access that session. You can only access session created through webdriver until webdriver restarts, after driver.exit() you will not be able to access those sessions created by webdriver.
https://github.com/Xeo786/Rufaydium-Webdriver#script-reloading

I am really into accessing all session which are not created through webdriver and I accidentally manage to do that multiple times, until chrome 100, after chrome 100 I do not face those accidents and I am still curious why and how that happened but still I haven't found any reason.

Code: Select all

; until chrome 100 sometimes/accidentally it return with all the browser sessions even with session not created with webdriver 
Session.getSessions() 

I don't know its security breach or something else but now chrome 100 do not commit that type of mistakes, well it was useful though.

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 25 Apr 2022, 03:12
by Milchmann
Xeo786 wrote:
22 Apr 2022, 06:16
Milchmann wrote:
22 Apr 2022, 05:08
Is there a way to determine the user and then enter this path in static ChromeProfile ?

Code: Select all

static ChromeProfile =
	( LTrim Join
	{
		"args": ["--user-data-dir=C:/%a_username%/Profile"],
	}
	)
I think it should be C:/Users/%a_username%/Profile
Does not work :

Code: Select all

 "args": ["--user-data-dir=C:/Users/%A_UserName%/AppData/Local/Google/Chrome/User Data"],
grafik.png
grafik.png (24.04 KiB) Viewed 4456 times
another idea?

Thank you

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 25 Apr 2022, 03:31
by Xeo786
Milchmann wrote:
25 Apr 2022, 03:12
Does not work :

Code: Select all

 "args": ["--user-data-dir=C:/Users/%A_UserName%/AppData/Local/Google/Chrome/User Data"],
grafik.png
another idea?

Thank you
.error says "cannot create default profile directory" hmmm
I haven't tried created session with my default chrome profile I can't say why webdriver trying to create directory instead reading it, or may be webdriver might not found profile directory,

ok I just found please confirm profile path using url chrome://version/
if should be

Code: Select all

"args": ["--user-data-dir=C:\Users\" a_username "\AppData\Local\Google\Chrome\User Data\Profile"]

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 25 Apr 2022, 07:29
by Milchmann
ok I just found please confirm profile path using url chrome://version/
if should be

Code: Select all

"args": ["--user-data-dir=C:\Users\" a_username "\AppData\Local\Google\Chrome\User Data\Profile"]
[/quote]


Thank you works,
.error says "cannot create default profile directory" hmmm
Do you have an example. I don`t understand......

Re: Rufaydium WebDriver (no selenium/websocket)

Posted: 25 Apr 2022, 08:02
by Xeo786
Milchmann wrote:
25 Apr 2022, 07:29
Do you have an example. I don`t understand......
paste following url into address bar of chrome and check correct profile path
chrome://version/