Jump to content

WebDriver UDF - Help & Support


Recommended Posts

Return value from _WD_ElementAction

I am trying to use the WebDriver to find the rectangle of an element on a page.  The following is a function I wrote to do this, and in its current form it includes a bunch of debugging ConsoleWrite's also. 

The main issue is the return value from _WD_ElementAction.  I have read _WD_ElementAction source code and I would expect it to return a string a Json BUT when I use it i get nothing as a return.   Initially I expected the response to be 

Quote

{"value":{"height":21,"width":79,"x":8,"y":62}}

Which is what i see in the debug output.  But on closer look to the source code it seems that _WD_ElementAction may parse out the "value" and only return 

Quote

{"height":21,"width":79,"x":8,"y":62}

But in my code I get nothing as a return value. 

 

Below is my code. 

Can anyone help?  
Should I expect a response from _WD_ElementAction?
Should I expect it to be JSon?
 

Func FindElementRect($session, $elementToFind)

   $feResult = _WD_FindElement($session, $_WD_LOCATOR_ByID, $elementToFind)
   ConsoleWrite("_WD_FindElement result: " & $feResult & @CRLF)

   ConsoleWrite("**** : " & _WD_ElementAction($session, $feResult, "rect"))     ; i can see something returned here

   $eaResult = _WD_ElementAction($session, $feResult, "rect")   ; in this case eaResult is blank
   ConsoleWrite("$eaResult: " & $eaResult & @CRLF)

   ConsoleWrite("@error is: " & @error & @CRLF)                 ;  never an error

   ; per debug log this is what I expect to get
   ;{"value":{"height":21,"width":79,"x":8,"y":62}}

   $oJson = Json_Decode($eaResult)
   Local $rect[4]
   $rect[0] = Json_Get($oJson, "[value][x]")
   ConsoleWrite("top Left X: " & $rect[0] & @CRLF)

   $rect[1] = Json_Get($oJson, "[value][y]")
   ConsoleWrite("top Left Y: " & $rect[1] & @CRLF)

   $rect[2] = $rect[0] + Json_Get($oJson, "[value][width]")
   ConsoleWrite("bottom right X: " & $rect[2] & @CRLF)

   $rect[3] = $rect[1] + Json_Get($oJson, "[value][height]")
   ConsoleWrite("bottom right Y: " & $rect[3] & @CRLF)

   return $rect
EndFunc

Many thanks in advance

Greg

Link to comment
Share on other sites

Hello @GregEisenberg You need to do this:

Local $oJsonRect=_WD_ElementAction($sSession, $sElements, 'rect')
ConsoleWrite("!" & Json_Get($oJsonRect, "[x]") & @CRLF)
ConsoleWrite("!" & Json_Get($oJsonRect, "[y]") & @CRLF)
ConsoleWrite("!" & Json_Get($oJsonRect, "[width]") & @CRLF)
ConsoleWrite("!" & Json_Get($oJsonRect, "[height]") & @CRLF)

 

 

Saludos

Edited by Danyfirex
Code tag fix
Link to comment
Share on other sites

@JonnyQuy You will need to supply more details if you want further assistance. For starters --

  • Which browser are you attempting to automate?
  • Have you downloaded the correct webdriver? If yes, where did you save it?
  • Did you modify wd_test.au3 to point to the above location?
  • Is at least one of the entries in the array $aTestSuite set to True?

If all of the above check out, then run the code in Scite and post the results from the Output pane.

Link to comment
Share on other sites

@Danyfirex Thank you.  I guess what makes debugging this hard is that when you assign the output of _WD_ElementAction to some local variant and then ConsoleWrite that variant - it prints nothing. You did answer my questions though and I really appreciate it.   For example in your code if you simply do 

ConsoleWrite("$oJsonRect: " & $oJsonRect & @CRLF) 

you end up with 

Quote

$oJsonRect: 

and that makes the user THINK they are getting back nothing. 

BTW:  Kudos to @Danp2 for this excellent UDF (and kudos to those who built it's dependencies too.) 

 

Link to comment
Share on other sites

3 minutes ago, GregEisenberg said:

@Danyfirex Thank you.  I guess what makes debugging this hard is that when you assign the output of _WD_ElementAction to some local variant and then ConsoleWrite that variant - it prints nothing. You did answer my questions though and I really appreciate it.   For example in your code if you simply do 

ConsoleWrite("$oJsonRect: " & $oJsonRect & @CRLF)

you end up with 

and that makes the user THINK they are getting back nothing. 

BTW:  Kudos to @Danp2 for this excellent UDF (and kudos to those who built it's dependencies too.) 

 

Danyfirex beat me to the answer by seconds, so I cancelled my reply.

What happens is _WD_ElementAction's "rect" $sCommand returns a JSON Object, therefore you don't need to Json_Decode the return variable.

In the console window's debug you get back:

_WD_ElementAction: {"value": {"x":966.0,"y":19.0,"width":34.0,"height":24.0}}

That gets reduced to {"x":966.0,"y":19.0,"width":34.0,"height":24.0} because the $sResponse gets run through a JSON_Decode and Json_Get($oJSON, "[value]") before getting returned to your variable. Notice that the parent "value" is now gone from the new JSON Object. That's why you omit it when you do your own Json_Get.

Link to comment
Share on other sites

 

On 12/6/2018 at 12:56 AM, Danp2 said:

@JonnyQuy You will need to supply more details if you want further assistance. For starters --

  • Which browser are you attempting to automate?
  • Have you downloaded the correct webdriver? If yes, where did you save it?
  • Did you modify wd_test.au3 to point to the above location?
  • Is at least one of the entries in the array $aTestSuite set to True?

If all of the above check out, then run the code in Scite and post the results from the Output pane.

  • I'm running for chrome browser
  • I downloaded "chromedriver_win32.zip", I saved it with the directory of wd_test.au3
  • If it is in the same directory with each other need to modify the path or not?
  • "TestAlerts", True I keep the default
Edited by JonnyQuy
Link to comment
Share on other sites

_WD_Option('Driver', 'D:\AUTOIT\WebDriver UDF\WebDriver-0.1.0.10\WebDriver-0.1.0.10\chromedriver.exe')
_WD_Option('DriverParams', '--log-path=' & @ScriptDir & '\chrome.log')
_WD_Option('Port', 9515)

$sDesiredCapabilities = '{"desiredCapabilities":{"javascriptEnabled":true,"nativeEvents":true,"acceptInsecureCerts":true}}'
_WD_Startup()
$sSession = _WD_CreateSession($sDesiredCapabilities)

_WD_Navigate($sSession, "http://google.com")
$sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//a[@class='gb_P']") ;"Images" link at the upper right
$sValue = _WD_ElementAction($sSession, $sElement, 'text') ;gets the text content of the node/element
ConsoleWrite('$sValue = ' & $sValue & @CRLF) ;"Images"
MsgBox(0,0,$sSession)

help me

Edited by JonnyQuy
Link to comment
Share on other sites

i have Cookie: cid_ck:c27b40a4-a5c6-43ac-a5dd-4e4a4f79d082; Domain=.hotname.com; Expires=Tue, 18-Jun-2019 12:32:21 GMT; Path=/+>      ____ i get from HttpRequest
i get from: document.cookie => cid_ck:c27b40a4-a5c6-43ac-a5dd-4e4a4f79d082;
i get from  _WD_Cookies :  cid_ck","path":"/","secure":false,"value":"c27b40a4-a5c6-43ac-a5dd-4e4a4f79d082"}

how do i add cookie in _WD_Cookies($sSession, $sCommand, $sOption = '')
What do i do with $sOption ?

Edited by JonnyQuy
Link to comment
Share on other sites

I have two questions (Chromedriver)

1: working off the example provided in the main thread, I can have it open chrome, log into a page (say google). The problem is when I re-start, it doesn't save the password or cookies so i have to log in every time. Is there a way to make user data persistant?

2: Every time I test my code it needs to open a new window. Is there a way to have it keep the same window between tests? So I can kill my script, start it, and just attach to chrome and continue on? Akin to _IE_Create() with tryattach set to 1. Basic attach if exists, else create new tab and navigate functionality.

0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e

Link to comment
Share on other sites

@corgano

1 hour ago, corgano said:

working off the example provided in the main thread, I can have it open chrome, log into a page (say google). The problem is when I re-start, it doesn't save the password or cookies so i have to log in every time. Is there a way to make user data persistant?

From http://chromedriver.chromium.org/capabilities --

Quote

Use custom profile (also called user data directory)

By default, ChromeDriver will create a new temporary profile for each session. At times you may want to set special preferences or just use a custom profile altogether. If the former, you can use the 'chrome.prefs' capability (described later below) to specify preferences that will be applied after Chrome starts. If the latter, you can use the user-data-dir Chrome command-line switch to tell Chrome which profile to use

I haven't actually done this, so you will need to work out the correct way to implement in Autoit.

1 hour ago, corgano said:

Every time I test my code it needs to open a new window. Is there a way to have it keep the same window between tests? So I can kill my script, start it, and just attach to chrome and continue on? Akin to _IE_Create() with tryattach set to 1. Basic attach if exists, else create new tab and navigate functionality.

I know this is possible in Firefox, but unsure if you can do this in Chrome. Please report back if you successfully find a way to do this.

Link to comment
Share on other sites

4 hours ago, Danp2 said:

@corgano

From http://chromedriver.chromium.org/capabilities --

I haven't actually done this, so you will need to work out the correct way to implement in Autoit.

 

IT looks like it should be
_WD_Option('DriverParams', '--user-data-dir='&@ScriptDir&'\userdata\ --log-path=' & @ScriptDir & '\chrome.log')
The chrome.log is created right, but the user data dir isn't created or used if it exists. Any ideas?

Edit:
image.png.f7586113bb9c1c01781873e66cc50dee.png
This leads me to believe it's not a command line peram, but it's stated here: http://chromedriver.chromium.org/capabilities
That it is possible. Where would I go to ask about it?

Edited by corgano

0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e

Link to comment
Share on other sites

You have to put it into ChromeOptions, which is part of the $sDesiredCapabilities string that is passed to _WD_CreateSession. I would suggest trying something like this --

$sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"chromeOptions": {"w3c": true, "args": [--user-data-dir='&@ScriptDir&'\userdata]}}}}'

 

Link to comment
Share on other sites

Damnit, I literally just got it

$sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"chromeOptions": {"w3c": true, "args":["user-data-dir=userData"] } }}}'

However using @scriptdir didn't work for me. simply having =userData worked though.

What about hving a persistent window and just re-attaching to it? any ideas?

0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...