GregEisenberg Posted June 11, 2018 Share Posted June 11, 2018 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 duzers 1 Link to comment Share on other sites More sharing options...
Danyfirex Posted June 11, 2018 Share Posted June 11, 2018 (edited) 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 June 11, 2018 by Danyfirex Code tag fix GregEisenberg, duzers and Danp2 3 Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut Link to comment Share on other sites More sharing options...
Danp2 Posted June 11, 2018 Author Share Posted June 11, 2018 @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. Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
GregEisenberg Posted June 11, 2018 Share Posted June 11, 2018 @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 More sharing options...
Decibel Posted June 11, 2018 Share Posted June 11, 2018 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. Danyfirex 1 Link to comment Share on other sites More sharing options...
JonnyQuy Posted June 13, 2018 Share Posted June 13, 2018 (edited) 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 June 13, 2018 by JonnyQuy Link to comment Share on other sites More sharing options...
JonnyQuy Posted June 13, 2018 Share Posted June 13, 2018 Can you provide me basic video tutorial which is not I can not activate it Link to comment Share on other sites More sharing options...
Danp2 Posted June 13, 2018 Author Share Posted June 13, 2018 (edited) Please post the complete output from Scite (Not an image; copy and paste the text here). Also, you could try disabling the TestAlerts entry and then enabling one of the other tests. Edited June 13, 2018 by Danp2 Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
JonnyQuy Posted June 13, 2018 Share Posted June 13, 2018 I do not understand, can you give me a few examples? Link to comment Share on other sites More sharing options...
Earthshine Posted June 13, 2018 Share Posted June 13, 2018 examples of how to paste the output of the editor? Danyfirex 1 My resources are limited. You must ask the right questions Link to comment Share on other sites More sharing options...
JonnyQuy Posted June 18, 2018 Share Posted June 18, 2018 I do not know how to let it work, Who can help me Link to comment Share on other sites More sharing options...
JonnyQuy Posted June 18, 2018 Share Posted June 18, 2018 (edited) _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 June 18, 2018 by JonnyQuy Link to comment Share on other sites More sharing options...
Danp2 Posted June 18, 2018 Author Share Posted June 18, 2018 @JonnyQuy ChromeDriver supports multiple standards, so you need to specifically designate that you want the W3C standard. Try changing your desired capabilities line to $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"chromeOptions": {"w3c": true }}}}' JonnyQuy 1 Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
JonnyQuy Posted June 18, 2018 Share Posted June 18, 2018 (edited) 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 June 18, 2018 by JonnyQuy Link to comment Share on other sites More sharing options...
Danp2 Posted June 18, 2018 Author Share Posted June 18, 2018 @JonnyQuy While I haven't done much with that function, we previously had a discussion that you help you over in the Development thread. Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
corgano Posted June 19, 2018 Share Posted June 19, 2018 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 More sharing options...
Danp2 Posted June 19, 2018 Author Share Posted June 19, 2018 @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. Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
corgano Posted June 19, 2018 Share Posted June 19, 2018 (edited) 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: 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 June 20, 2018 by corgano 0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e Link to comment Share on other sites More sharing options...
Danp2 Posted June 20, 2018 Author Share Posted June 20, 2018 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]}}}}' Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
corgano Posted June 20, 2018 Share Posted June 20, 2018 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 More sharing options...
Recommended Posts