Jump to content
Danp2

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

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
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.) 

 

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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]}}}}'

 

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Jgladden
      Dan - thanks for all that you do - this stuff is great. 
      Hoping you can assist with an issue we are having now that we have moved to Windows 10/Server 2016. The Chrome interactions were working flawlessly until moving over. Now my code fails when attempting to create the session. As you can see, our Chrome install is not in a standard location but I have validated the path to the binary. I have attached some detail below including system info, console output and the chrome log detail. I have tried several recommendations that have seen in various forums but none have made a difference
      Any assistance you can give would be greatly appreciated. 
      Thanks in advance, 
      chrome_Details.txt
    • By Danp2
      Introduction
      This UDF will allow you to interact with any browser that supports the W3C WebDriver specifications. Supporting multiple browsers via the same code base is now possible with just a few configuration settings.
      Requirements
      JSON UDF https://www.autoitscript.com/forum/topic/148114-a-non-strict-json-udf-jsmn
      WinHTTP UDF https://www.autoitscript.com/forum/topic/84133-winhttp-functions/
      HtmlTable2Array UDF (optional) https://www.autoitscript.com/forum/topic/167679-read-data-from-html-tables-from-raw-html-source/
      WebDriver for desired browser
      Chrome WebDriver https://sites.google.com/a/chromium.org/chromedriver/downloads FireFox WebDriver https://github.com/mozilla/geckodriver/releases Edge WebDriver https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ Source Code
      You will always be able to find the latest version in the GitHub Repo 
      Help / Support
      See the wiki for details on the UDF --
      https://www.autoitscript.com/wiki/WebDriver
      Please post any questions, suggestions or errors in the GH&S thread.
      https://www.autoitscript.com/forum/topic/201106-webdriver-udf-help-support-ii/
    • By Langmeister
      I am once again asking for your experienced assistance. If I open a website that uses notifications I am asked to allow or block them for that website after a few seconds. This notification pops up every time the page gets navigated to, even tho you have clicked on allow for several times. I am explicitly not searching for smth to get rid of "Chrome is being controlled by automated test sw". Instead I am searching for a line of script to disable all notifications by default: like here chrome://settings/content/notifications. 
      This is code should give you an example of what notifications I am talking about:
      #include "wd_core.au3" #include "wd_helper.au3" Local $sDesiredCapabilities, $sSession, $sID _WD_Option("Driver", "C:\Program Files (x86)\AutoIt3\chromedriver.exe") _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true }}}}' _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_Navigate($sSession, "https://webradio.planetradio.de/") _WD_LoadWait($sSession)  
    • By Langmeister
      Hi, I'm sure that this is a simple question regarding webdriver udf but my search on the forum did not result in the exact same scenario that I need. I will adapt it to my corporate needs but at first I want it to work with an example everybody can reproduce if needed.
      I navigate to https://www.daysoftheyear.com/ and want to find out what special day today is. Using the following Code returns the wanted text that today is 'shark awareness day' in the console but it is not pasted in notepad as it is not copied as it probably should be.
      #include "wd_core.au3" #include "wd_helper.au3" Local $sDesiredCapabilities, $sSession, $sID _WD_Option("Driver", "C:\Program Files (x86)\AutoIt3\chromedriver.exe") _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true }}}}' _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_Navigate($sSession, "https://www.daysoftheyear.com/?timezone_offset=nan") _WD_LoadWait($sSession) Sleep(3000) Local $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "/html/body/div[2]/header/div/div[1]/div/div[2]/h3/a") _WD_ElementAction($sSession, $sElement, 'text') ClipGet() Run("notepad.exe") Sleep(500) Send("^v") Scite returns this, therefore the text has been found but the last mile to paste it to notepad or excel does not work for me.
      __WD_Get: URL=HTTP://127.0.0.1:9515/session/b72166b774d7fefb258b3721fc1d4306/element/657e6b5d-31a9-46a8-85c4-acb7f72bf659/text __WD_Get: StatusCode=200; $iResult = 0; $sResponseText={"value":"Shark Awareness Day"}... _WD_ElementAction: {"value":"Shark Awareness Day"}... Thanks in advance! 
       
    • By Langmeister
      Hi, I need help performing actions in Salesforce using IE. I used to complete tasks via MouseMove/MouseClick etc. on the Chrome application of SF, but unfortunately this only works for me and not my colleagues due to different positions of things etc. Being unable to get Webdriver UDF or Chromedriver running to interact with the code directly, I chose to look into the IE UDF. ATM I'm trying to tick a specific checkbox in SF which simply allows me to "select all checkboxes" at the same time. Applying the following code on a random website with checkboxes works just fine for me: (in this case selecting cheese checkbox)
      #include <IE.au3> Local $oIE = _IECreate("http://www.echoecho.com/htmlforms09.htm") Local $oSubmit = _IEGetObjByName($oIE, "option3") _IEAction($oSubmit, "click") _IELoadWait($oIE) But applying it to the Salesforce website it does exactly nothing and responds with these warnings/errors:
      The script is exactly the same, except for website and the input name tag of the desired checkbox being different.
      #include <IE.au3> Local $oIE = _IECreate("Corporate Salesforce URL") Local $oSubmit = _IEGetObjByName($oIE, "myPage:myForm:oliListBlock:oliListTable:j_id36") _IEAction($oSubmit, "click") _IELoadWait($oIE) As its working with random websites my guess is that there has to be something done to get it work with SF.
      Hope the more experienced SF+AutoIt pros can help me out here. Thanks in advance!
×
×
  • Create New...