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?
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
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
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
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
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
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.
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?