Giter Site home page Giter Site logo

citrixplugin's People

Contributors

3dgiordano avatar dependabot[bot] avatar pmouawad avatar refaelbotbol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

citrixplugin's Issues

Timed out waiting for Logon due to Notification Banner in Server

The System Security Notice notification banner in our server prevents the logon to run automatically which causes the script to fail. This banner is shown before the Citrix User session login.

Script Flow :

  1. In my script, MC-DownloadICA Test Fragment is used to login a Citrix user to the Citrix Storefront.
  2. Then the Citrix Application Launcher opens the Citrix Receiver window.
  3. On the opened Citrix Receiver window, a System Security Notice notification banner is shown (which is expected on our servers).
  4. On this page, an ENTER key is pressed to proceed.
  5. After that, the Citrix User logs in then the Authentication window of the application being tested should appear after few seconds.

image

ERROR Details :

2021-01-05 12:31:43,295 [StandardJMeterEngine id:43] INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2021-01-05 12:31:43,295 [Search 1-1 id:46] INFO o.a.j.t.JMeterThread: Thread started: Search 1-1
2021-01-05 12:31:43,295 [Search 1-1 id:46] INFO c.b.j.c.s.StartApplicationSampler: Search 1-1 on sampler 00 Citrix Application Launcher ensures OCR is initialized
2021-01-05 12:31:43,295 [Search 1-1 id:46] INFO c.b.j.c.s.StartApplicationSampler: OCR initialized in 0 millis
2021-01-05 12:31:43,295 [Search 1-1 id:46] INFO o.a.j.s.FileServer: Stored: /Data/SkyPriceData.csv
2021-01-05 12:31:44,920 [ComThread for Search 1-1 id:47] INFO c.b.j.c.c.w.WinCitrixClient: Sess: des_dim=nullxnull, des_depth=nullbpp, dim=1024x768, depth=24bpp, Scr: dim=2546x1357, depth=32bpp
2021-01-05 12:32:44,414 [Search 1-1 id:46] ERROR c.b.j.c.s.CitrixBaseSampler: com.blazemeter.jmeter.citrix.sampler.SamplerRunException: Timed out waiting for Logon:Unable to handle Citrix client action. See log file for more informations.
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:166)
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.sample(CitrixBaseSampler.java:269)
	at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:635)
	at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558)
	at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489)
	at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
	at java.lang.Thread.run(Unknown Source)
Caused by: com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for Logon
	at com.blazemeter.jmeter.citrix.client.windows.WinCitrixClient.startSession(WinCitrixClient.java:279)
	at com.blazemeter.jmeter.citrix.client.AbstractCitrixClient.start(AbstractCitrixClient.java:375)
	at com.blazemeter.jmeter.citrix.sampler.StartApplicationSampler.doClientAction(StartApplicationSampler.java:97)
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:162)
	... 6 more

com.blazemeter.jmeter.citrix.sampler.SamplerRunException: Timed out waiting for Logon:Unable to handle Citrix client action. See log file for more informations.
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:166) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.sample(CitrixBaseSampler.java:269) [citrix-jmeter-0.7.0.jar:?]
	at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:635) [ApacheJMeter_core.jar:5.4]
	at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) [ApacheJMeter_core.jar:5.4]
	at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) [ApacheJMeter_core.jar:5.4]
	at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) [ApacheJMeter_core.jar:5.4]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]
Caused by: com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for Logon
	at com.blazemeter.jmeter.citrix.client.windows.WinCitrixClient.startSession(WinCitrixClient.java:279) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.client.AbstractCitrixClient.start(AbstractCitrixClient.java:375) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.sampler.StartApplicationSampler.doClientAction(StartApplicationSampler.java:97) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:162) ~[citrix-jmeter-0.7.0.jar:?]
	... 6 more
2021-01-05 12:32:44,414 [Search 1-1 id:46] INFO o.a.j.t.JMeterThread: Stop Test Now detected by thread: Search 1-1

@3dgiordano provided a pre-release version of the plugin before containing a fix for this but I was hoping it can be integrated on newer releases :)

Enhancement: getForegroundWindowCaption

Class CitrixClient.java has a method:
int getForegroundWindowID();
That ID (a negative short int?) is useless.
Proposal: new method
String getForegroundWindowCaption();

New Element that exposes results of End Clause

As a user, I want to have an extractor working on Citrix sample results to

  1. extract the value calculated by the end clause and which allowed its validation
  2. Assign the value to a variable designated by the user
  3. If the value does not exist, assign a default value defined by the user to the variable.

ActiveApp_Timeout : Timed out waiting for Active App

Some of the users fail to initialize when number of users in the test is set to more than 10.
I can consistently initialize all users and complete the tests when using 1, 5 and 10 users.

The following did not resolve the issue :

  • Increasing user ramp-up period
  • Increasing delays in-between steps
  • Setting bzm.citrix.client_factory.client_property.connect_timeout_ms to 600000
  • Ending concentr.exe process in the server where JMeter is running

Error Details

image

ERROR c.b.j.c.s.CitrixBaseSampler: com.blazemeter.jmeter.citrix.sampler.SamplerRunException: Timed out waiting for Active App:Unable to handle Citrix client action. See log file for more informations.
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:166)
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.sample(CitrixBaseSampler.java:269)
	at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:635)
	at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558)
	at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489)
	at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
	at java.lang.Thread.run(Unknown Source)
Caused by: com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for Active App
	at com.blazemeter.jmeter.citrix.client.windows.WinCitrixClient.startSession(WinCitrixClient.java:279)
	at com.blazemeter.jmeter.citrix.client.AbstractCitrixClient.start(AbstractCitrixClient.java:375)
	at com.blazemeter.jmeter.citrix.sampler.StartApplicationSampler.doClientAction(StartApplicationSampler.java:97)
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:162)
	... 6 more

com.blazemeter.jmeter.citrix.sampler.SamplerRunException: Timed out waiting for Active App:Unable to handle Citrix client action. See log file for more informations.
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:166) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.sample(CitrixBaseSampler.java:269) [citrix-jmeter-0.7.0.jar:?]
	at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:635) [ApacheJMeter_core.jar:5.4]
	at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) [ApacheJMeter_core.jar:5.4]
	at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) [ApacheJMeter_core.jar:5.4]
	at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) [ApacheJMeter_core.jar:5.4]
	at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]
Caused by: com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for Active App
	at com.blazemeter.jmeter.citrix.client.windows.WinCitrixClient.startSession(WinCitrixClient.java:279) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.client.AbstractCitrixClient.start(AbstractCitrixClient.java:375) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.sampler.StartApplicationSampler.doClientAction(StartApplicationSampler.java:97) ~[citrix-jmeter-0.7.0.jar:?]
	at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.handleClientAction(CitrixBaseSampler.java:162) ~[citrix-jmeter-0.7.0.jar:?]
	... 6 more

Citrix Recorder is too slow

Hi I am using Citrix recorder. when I run script it works as expected but when i start recording using Citrix Recorder and download ICA, It initiate after 1 minute and there is a gap of more than one min in each https call.

CitrixClientException: Timed out waiting for OnConnect

I am getting issue, Citrix timed out waiting for connection whereas ICA is download and Application is launched successfully as shown below in log and images

ICA Downloaded Successfully.

image

Citrix Recorder/Citrix Receiver Launched Successful

image

Log Error

2020-12-03 02:17:21,156 INFO o.a.j.u.SSLManager: KeyStore created OK
2020-12-03 02:17:21,156 WARN o.a.j.u.SSLManager: Keystore file not found, loading empty keystore
2020-12-03 02:17:41,317 INFO o.a.j.t.JMeterThread: Thread is done: ICA-Download-By-Citrix-Recorder 2-1
2020-12-03 02:17:41,317 INFO o.a.j.t.JMeterThread: Thread finished: ICA-Download-By-Citrix-Recorder 2-1
2020-12-03 02:17:41,323 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test
2020-12-03 02:17:41,464 INFO c.b.j.c.r.CitrixRecorder: ICA file successfully downloaded in : D:\DownloadICA\4503600b-76fe-4e1e-8b0d-51babe3d3dd1.ica
2020-12-03 02:17:56,620 ERROR c.b.j.c.c.w.WinCitrixClient: Reason: 11
2020-12-03 02:17:56,656 ERROR c.b.j.c.r.g.CitrixRecorderGUI: Error occured starting citrix application com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for OnConnect
java.util.concurrent.ExecutionException: com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for OnConnect
	at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_251]
	at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_251]
	at javax.swing.SwingWorker.get(Unknown Source) ~[?:1.8.0_251]
	at com.blazemeter.jmeter.citrix.recorder.gui.CitrixRecorderGUI$StartRecording.done(CitrixRecorderGUI.java:1108) [citrix-jmeter-0.6.0.jar:?]
	at javax.swing.SwingWorker$5.run(Unknown Source) [?:1.8.0_251]
	at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(Unknown Source) [?:1.8.0_251]
	at sun.swing.AccumulativeRunnable.run(Unknown Source) [?:1.8.0_251]
	at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(Unknown Source) [?:1.8.0_251]
	at javax.swing.Timer.fireActionPerformed(Unknown Source) [?:1.8.0_251]
	at javax.swing.Timer$DoPostEvent.run(Unknown Source) [?:1.8.0_251]
	at java.awt.event.InvocationEvent.dispatch(Unknown Source) [?:1.8.0_251]
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source) [?:1.8.0_251]
	at java.awt.EventQueue.access$500(Unknown Source) [?:1.8.0_251]
	at java.awt.EventQueue$3.run(Unknown Source) [?:1.8.0_251]
	at java.awt.EventQueue$3.run(Unknown Source) [?:1.8.0_251]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_251]
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) [?:1.8.0_251]
	at java.awt.EventQueue.dispatchEvent(Unknown Source) [?:1.8.0_251]
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) [?:1.8.0_251]
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) [?:1.8.0_251]
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) [?:1.8.0_251]
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source) [?:1.8.0_251]
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source) [?:1.8.0_251]
	at java.awt.EventDispatchThread.run(Unknown Source) [?:1.8.0_251]
Caused by: com.blazemeter.jmeter.citrix.client.CitrixClientException: Timed out waiting for OnConnect
	at com.blazemeter.jmeter.citrix.client.windows.WinCitrixClient.startSession(WinCitrixClient.java:274) ~[citrix-jmeter-0.6.0.jar:?]
	at com.blazemeter.jmeter.citrix.client.AbstractCitrixClient.start(AbstractCitrixClient.java:346) ~[citrix-jmeter-0.6.0.jar:?]
	at com.blazemeter.jmeter.citrix.recorder.CitrixRecorder.startRecord(CitrixRecorder.java:183) ~[citrix-jmeter-0.6.0.jar:?]
	at com.blazemeter.jmeter.citrix.recorder.gui.CitrixRecorderGUI$StartRecording.doInBackground(CitrixRecorderGUI.java:1095) ~[citrix-jmeter-0.6.0.jar:?]
	at com.blazemeter.jmeter.citrix.recorder.gui.CitrixRecorderGUI$StartRecording.doInBackground(CitrixRecorderGUI.java:1074) ~[citrix-jmeter-0.6.0.jar:?]
	at javax.swing.SwingWorker$1.call(Unknown Source) ~[?:1.8.0_251]
	at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_251]
	at javax.swing.SwingWorker.run(Unknown Source) ~[?:1.8.0_251]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:1.8.0_251]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:1.8.0_251]
	at java.lang.Thread.run(Unknown Source) ~[?:1.8.0_251]
2020-12-03 02:18:00,704 INFO c.b.j.c.c.w.WinCitrixClient: Sess: des_dim=1920x1080, des_depth=nullbpp, dim=1920x1016, depth=24bpp, Scr: dim=1920x1080, depth=32bpp

Citrix Interaction : provide the asserted value and the actual one

Hi,

I encounter sometime errors during the execution of the scenario.
To diagnose it, I use the View Results Tree and the Citrix Interaction.
When I see it at first glance, it seems correct (the zone to search the OCR text and the value looks the same). But when I look more precisely, there is a small difference (I will create a bug for this problem in the OCR engine).

Actually, it would be really nice to display on the left of the Citrix Interaction the value that was expected and the value that was effectively recognized (either ocr or hash) so that we could simply see the difference.
If both text (expected and actual) are one under the other, we could see the difference at a glance.

Small bug relative to save action

Hi,

I do not know if it is a a problem in citrix plugin or jmeter globaly but I case, I send it to you :
If I modify a value of a Citrix Interaction (the X or Y value of the End Clause) and clic immediately on the save button, my modification is lost (it is the same with ctrl+s). If I just leave the field to put the focus elsewhere, the save is correct...

ICA file is not downloading

I am using following details.

Details: I am using following details to connect to Citrix

Providing following credentials

Getting following errors

Let me know what i am missing . All above details are working as expected for me manually using browser.
I have also noticed that following information is missing in Download ICA image.

Server Port, Server IP/Name & port.

Also, I need to Launch App from Citrix Portal which is desktop application and need to implement performance testing on this.

Also, If I use HTTPS Recording template using JMeter, scripts work fine but using Blazemetter template i am getting following issues mentioned above in images attached,

Record Text Input with Special characters issues

Hi,

I am trying to record a text input i.e. Password string. and password is "P@&&w0rd" in this case, i have noticed that it do not treat as as text but as a sequence. suppose i have to login using multiple accounts, then in this case the sequence will be hard-coded. Can you suggest me how to deal with this?

New OCR Extractor element

Add a new element that allows to extract text from a screenshot.
This is required to be able to build real-life test scripts.

NullPointerException / NPE when searching with JMeter 5.0

Having a Test plan that contains Citrix Interaction Sampler Do CTRL+F Enter some data Hit search
A stacktrace appears in logs:

2019-01-08 13:44:21,297 ERROR o.a.j.g.a.SearchTreeDialog: Error occurred searching for word:ICA File in node:18 inputFileName java.lang.NullPointerException: null at org.apache.jmeter.testelement.property.ObjectProperty.getStringValue(ObjectProperty.java:104) ~[ApacheJMeter_core.jar:5.0 r1840935] at org.apache.jmeter.testelement.AbstractTestElement.getSearchableTokens(AbstractTestElement.java:642) ~[ApacheJMeter_core.jar:5.0 r1840935] at org.apache.jmeter.gui.action.SearchTreeDialog.searchInTree(SearchTreeDialog.java:364) [ApacheJMeter_core.jar:5.0 r1840935] at org.apache.jmeter.gui.action.SearchTreeDialog.doSearch(SearchTreeDialog.java:332) [ApacheJMeter_core.jar:5.0 r1840935] at org.apache.jmeter.gui.action.SearchTreeDialog.actionPerformed(SearchTreeDialog.java:242) [ApacheJMeter_core.jar:5.0 r1840935] at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) [?:1.8.0_191] at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) [?:1.8.0_191] at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) [?:1.8.0_191] at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) [?:1.8.0_191] at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) [?:1.8.0_191] at java.awt.Component.processMouseEvent(Component.java:6539) [?:1.8.0_191] at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) [?:1.8.0_191] at java.awt.Component.processEvent(Component.java:6304) [?:1.8.0_191] at java.awt.Container.processEvent(Container.java:2239) [?:1.8.0_191] at java.awt.Component.dispatchEventImpl(Component.java:4889) [?:1.8.0_191] at java.awt.Container.dispatchEventImpl(Container.java:2297) [?:1.8.0_191] at java.awt.Component.dispatchEvent(Component.java:4711) [?:1.8.0_191] at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) [?:1.8.0_191] at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) [?:1.8.0_191] at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) [?:1.8.0_191] at java.awt.Container.dispatchEventImpl(Container.java:2283) [?:1.8.0_191] at java.awt.Window.dispatchEventImpl(Window.java:2746) [?:1.8.0_191] at java.awt.Component.dispatchEvent(Component.java:4711) [?:1.8.0_191] at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) [?:1.8.0_191] at java.awt.EventQueue.access$500(EventQueue.java:97) [?:1.8.0_191] at java.awt.EventQueue$3.run(EventQueue.java:709) [?:1.8.0_191] at java.awt.EventQueue$3.run(EventQueue.java:703) [?:1.8.0_191] at java.security.AccessController.doPrivileged(Native Method) [?:1.8.0_191] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) [?:1.8.0_191] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) [?:1.8.0_191] at java.awt.EventQueue$4.run(EventQueue.java:733) [?:1.8.0_191] at java.awt.EventQueue$4.run(EventQueue.java:731) [?:1.8.0_191] at java.security.AccessController.doPrivileged(Native Method) [?:1.8.0_191] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) [?:1.8.0_191] at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) [?:1.8.0_191] at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) [?:1.8.0_191]

This Affects 0.3.0

Errors noticed when running two 2 vusers on same machine

I'm trying to record some actions of a Notepad application from Citrix StoreFront.

Everything works fine for a single vuser. The Notepad is launched, all my keystrokes and mouse clicks are replayed seamlessly. However, when I set the number of threads to 2 and run the test in jmeter non-gui mode, I notice that two notepads launch but the actions pass in only one thread.

Does that mean I need to use two machines/LGs to test with 2 threads? Doesn't this plugin support a headless mode? Did I miss any key configuration?

Key Sequence bug on duplication of Citrix Interaction

If you duplicate a Citrix Interaction that contains many key sequences (for exemple like pressing scroll up many times), the original and duplicated citrix interactions are clearly differents but the keysequences are the same.
Actually if you modify the keysequence of the original citrix interaction, it impacts the cloned citrix interaction...

I suspect it is some sort of clone of java objects that have the same reference for the key sequence list...

Allow determination of X and Y based on image search

Hi,
I have done some work with the citrix plugin and find it is a good bit of software, quite useful for citrix workload testing.

I have a case I can not simply handle with the current functions of the citrix plugin. My case is to clic on a small icon in a screen whose content is web based. With absolute coordinate, not problem. But in my case, the coordinate of the icon to clic is not always the same depending on the length of text just before the icon. So I can not determine an absolute coordinate that works in every case.

The solution could be a Citrix XY coordinate Extractor that has as input :

  • a search zone rectangle
  • and the image of the icon to find
    It would creates one or two variables (the X and Y coordinates) that correspond to the center of the image that has been found in the search zone.
    So that I could simply use these variables to parameterize the mouse click for the next Citrix Interaction Sampler.

What do you think of this ?
Could you please add this to the citrix plugin ? It would be amazing.

Regards,

Sampler Application Launcher fails without taking into account the configured timeout

Using Mozilla Firefox application, do a recording with 1 Application Launcher and then a text input.

Replay, the Application Launcher fails ignoring the configured timeout and in logs we see:

Unable to recognize text in area java.awt.Rectangle[x=61,y=-10,width=55,height=24]: Unable to recognize text in area java.awt.Rectangle[x=61,y=-10,width=55,height=24]: Exceeding image area java.awt.Rectangle[x=0,y=0,width=640,height=480]. 2019-01-29 23:56:32,865 DEBUG c.b.j.c.c.s.c.PollingStrategy: Test #1 fail context: com.blazemeter.jmeter.citrix.clause.ClauseComputationException: Unable to recognize text in area java.awt.Rectangle[x=61,y=-10,width=55,height=24]: Unable to recognize text in area java.awt.Rectangle[x=61,y=-10,width=55,height=24]: Exceeding image area java.awt.Rectangle[x=0,y=0,width=640,height=480]. at ....

OCR recognition error

Hi,

I have many numbers to recognize (they are variables in my scenario) and it regularly falls in error through OCR recognition.
Here is an exemple in image :
image

The OCR do not recognize the correct number of zeros :
30739070800013 is the expected value.
3073907080013 is the recognized value.

Another one :
image
30761630000017 expected
3076163000017 recognized

Another one :
image
30243218200012 expected
0243218200012 recognized

Hope this helps you to improve the OCR engine.

Citrix applications that have extra security warning times out recording and wont stop test

Tested with both versions 0.3.0 and 0.4.3.

Scenario: trying out the Plugin against a Citrix published application that has a Windows warning on login to say "All login attempts are audited" or something of that sort.

Template is changed to accommodate fetching of the ICA file. The samplers leading up to Citrix Application Launcher step are successful and the Citrix window opens. It then hangs on the Warning window without allowing interaction in the Citrix window, while nothing changes in JMeter (cannot click on "Application Started" button). After timeout period, Citrix window closes, and JMeter test will not allow force stop of test. Need to force stop JMeter to continue.

Attempted resolution: Tried adding in Citrix interaction element to click or press enter before validating with Application Started. Since it was the Citrix Application Launcher element that's hanging, we tried to run the Citrix Interaction sampler in a parallel controller, so that the application could be started and the interaction could take place, but that didn't work.

See the JMeter Log attached, in case it is of any help.

jmeter.log

Support JVM 64 bits

Currently plugin works only on JVM 32 Bits.

This enhancement is to allow supporting JVM 64 bits.

Recording Step Selection Hash Check button does nothing

Hello Eric (Using github as I don't have your mail),
1/ Bad news , I don't reproduce the bugs you showed me at the end of conf call:

  • Big timeout
  • Nothing happening with Selection Hash Check

So I'll need user.properties, jmeter.log and the content of popup that appears on start as discussed.
Attach them to this issue and edit title.

2/ Good news is that I reproduce the other issue with negative coordinates.

For information:

More documentation Required

Hi,

Thanks for this plugin. I have installed and configured Versions: 0.5.5 from jmeter plugin. I tried to build this code but somehow found issues when installing in JMeter.

The Downloaded Versions: 0.5.5 is installed successfully. But ICA is not downloading properly. It would be great if you can provide step by step documentation for this plugin.

How to find window title ?

Jmeter [5.4.3] with Citrix. Can any of you help how to find the active window name ?
We are able to validate window using window exists but in this case we are giving the window name and checking it.
Is there a assertion or any other method to get the active window name ?

Negative coordinates appear

As discussed yesterday, you see in logs:
Unable to compute clause value at test #13: Unable to hash area java.awt.Rectangle[x=-645,y=-309,width=68,height=26]:

How can i navigate with TAB key

Hi,

I need to navigate the application with tab key so i am trying to find this under KeySequence but not able to locate it. Can you please guide me on this?

Also I need to execute the application with 50 users. So will be please recommend the configuration setting for that.

Regards,
Pradeep Kumar
TAB issue

Enhancement: asynchronous catch windows

Een Appl Under Test sometimes has asynchronous windows, for example: an error dialog for example witch apear without any perticulair user interaction.
You cant "catch" these windows, a Citrix Interaction block met End Clause is useless, there is no predefined user interaction

CitrixRecorder is not initialized if using nightly build due to unhandled condition in parsing version number

Exception:
2019-01-09 10:56:25,642 WARN o.a.j.g.u.MenuFactory: Could not instantiate class: com.blazemeter.jmeter.citrix.recorder.gui.CitrixRecorderGUI java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_191] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_191] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_191] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_191] at org.apache.jmeter.gui.util.MenuFactory.getGUIComponent(MenuFactory.java:174) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.gui.util.MenuFactory.initializeMenus(MenuFactory.java:141) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.gui.util.MenuFactory.<clinit>(MenuFactory.java:106) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.control.gui.TestPlanGui.createPopupMenu(TestPlanGui.java:92) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.gui.tree.JMeterTreeNode.createPopupMenu(JMeterTreeNode.java:185) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.gui.action.EditCommand.doAction(EditCommand.java:46) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.gui.action.ActionRouter.performAction(ActionRouter.java:88) ~[ApacheJMeter_core.jar:r1850815] at org.apache.jmeter.gui.action.ActionRouter.lambda$actionPerformed$0(ActionRouter.java:70) ~[ApacheJMeter_core.jar:r1850815] at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) [?:1.8.0_191] at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) [?:1.8.0_191] at java.awt.EventQueue.access$500(EventQueue.java:97) [?:1.8.0_191] at java.awt.EventQueue$3.run(EventQueue.java:709) [?:1.8.0_191] at java.awt.EventQueue$3.run(EventQueue.java:703) [?:1.8.0_191] at java.security.AccessController.doPrivileged(Native Method) [?:1.8.0_191] at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) [?:1.8.0_191] at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:1.8.0_191] at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) [?:1.8.0_191] at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) [?:1.8.0_191] Caused by: java.lang.NumberFormatException: For input string: "r1850815" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) ~[?:1.8.0_191] at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122) ~[?:1.8.0_191] at java.lang.Float.parseFloat(Float.java:451) ~[?:1.8.0_191] at com.blazemeter.jmeter.citrix.recorder.gui.CitrixRecorderGUI.setupTemplate(CitrixRecorderGUI.java:187) ~[citrix-jmeter-0.3.0.jar:?] at com.blazemeter.jmeter.citrix.recorder.gui.CitrixRecorderGUI.<init>(CitrixRecorderGUI.java:179) ~[citrix-jmeter-0.3.0.jar:?] ... 26 more

Already fixed in next delivery

Unable to run test using plugin in non-gui mode

Hi Team,

It is to request your support regarding using this plugin in non-gui mode.

Scenario: When trying to run this in non-gui mode. Test run gets stuck at 'Citrix Application Launcher'. Works fine in GUI mode.

Please if anybody could assist regarding this issue urgently.

Can reach out to me at [email protected]

Thanks
Pritpal Singh

Handle login prompt before main application started

It seems there is no way of handling application login prompt that appears before main application window is loaded.
While recording, once Citrix app is launched, there is a login prompt displayed for the main application. At this point "Application Started" button in the recorder is still disabled. Entering user credentials manually and clicking Login button will result in main application being loaded. Only then "Application Started" button becomes enabled. However, there is no way of handling this login prompt window during replay. When attempting to use "Citrix Interaction" after "Request ICA File" step, it results in error "No running Citrix client found.". Please advise.

End Clause 'Window Gets Foreground' to late

Citrix Interaction End Clause 'Window Gets Foreground' is to late with quick windows. (see logging below)
The plugin sees de window with caption 'Voer bewegingscode in', but it still gets an timeout on "Window Gets Foreground" End Clause. The end clause works but is it is not garenteed it is still active/ on the foreground.

`2022-09-15 10:19:37,301 DEBUG o.a.j.c.GenericController: Calling next on: class org.apache.jmeter.control.GenericController
2022-09-15 10:19:37,301 DEBUG o.a.j.t.p.AbstractProperty: merging in class org.apache.jmeter.testelement.property.CollectionProperty
2022-09-15 10:19:37,301 DEBUG c.b.j.c.s.CitrixBaseSampler: Use Client from CitrixSessionHolder
2022-09-15 10:19:37,316 DEBUG c.b.j.c.s.CitrixBaseSampler: On sampler Klik verrekijker, Citrix client is running: true whereas policy is REQUIRED
2022-09-15 10:19:37,316 DEBUG c.b.j.c.c.AbstractCitrixClient: Adds a listener, Total: 1
2022-09-15 10:19:37,316 DEBUG c.b.j.c.s.CitrixBaseSampler: On sampler Klik verrekijker starts listening Citrix client before sampling operations
2022-09-15 10:19:37,316 DEBUG c.b.j.c.s.InteractionSampler: Thread Group 1-1 on sampler Klik verrekijker samples click at pos X=1240, Y=575 (rel=false) with butt=[LEFT] and modifiers=[]
2022-09-15 10:19:37,316 TRACE c.b.j.c.c.AbstractCitrixClient: Relays mouse button query with bUp=false, position=java.awt.Point[x=1240,y=575], origPosition=null, btns=[LEFT] and modifiers=[] to 1 listeners
2022-09-15 10:19:37,316 TRACE c.b.j.c.c.AbstractCitrixClient: Relays mouse button query with bUp=true, position=java.awt.Point[x=1240,y=575], origPosition=null, btns=[LEFT] and modifiers=[] to 1 listeners
2022-09-15 10:19:37,316 TRACE c.b.j.c.s.InteractionSampler: Thread Group 1-1 MOUSE_CLICK waits 996ms before next mouse click
2022-09-15 10:19:37,412 DEBUG c.b.j.c.c.w.e.SessionAdapter: onWindowForeground: windowID=66586
2022-09-15 10:19:37,413 DEBUG c.b.j.c.c.w.WinCitrixClient: Potential foreground window: 66586
2022-09-15 10:19:37,419 DEBUG c.b.j.c.c.w.e.SessionAdapter: onWindowCreate: window=[ID=66586, caption=Voer bewegingscode in, style=0x96c80000, extendedStyle=0x100101]
2022-09-15 10:19:37,428 DEBUG c.b.j.c.c.w.WinCitrixClient: Sets window info:[caption=Voer bewegingscode in, area=java.awt.Rectangle[x=527,y=407,width=229,height=131]] to window 66586
2022-09-15 10:19:37,428 DEBUG c.b.j.c.c.w.WinCitrixClient: Confirm window 66586 as foreground.
2022-09-15 10:19:37,428 DEBUG c.b.j.c.c.w.WinCitrixClient: Switches foreground to window 66586 with caption 'Voer bewegingscode in'
2022-09-15 10:19:37,428 DEBUG c.b.j.c.c.AbstractCitrixClient: Relays FOREGROUND window event to 1 listeners
2022-09-15 10:19:37,495 DEBUG o.a.j.v.ViewResultsFullVisualizer: Expanded: [[Root]]
2022-09-15 10:19:37,495 DEBUG o.a.j.v.ViewResultsFullVisualizer: Elements: [Root]
2022-09-15 10:19:37,905 DEBUG c.b.j.c.c.w.e.WindowAdapter: onLargeIconChange for window 66586: largeIconHash=d0ad781b4f866144e79f2c67d1274ba6
2022-09-15 10:19:37,906 DEBUG c.b.j.c.c.w.e.WindowAdapter: onSmallIconChange for window 66586: smallIconHash=2e741538f5592da24fe834cefc630916
2022-09-15 10:19:38,315 DEBUG c.b.j.c.c.AbstractCitrixClient: Removes a listener, Total: 0
2022-09-15 10:19:38,315 DEBUG c.b.j.c.s.CitrixBaseSampler: Stops listening Citrix client after sampling operations
2022-09-15 10:19:38,315 DEBUG c.b.j.c.s.CitrixBaseSampler: On sampler Klik verrekijker waits for end clause using WINDOW_FOREGROUND strategy
2022-09-15 10:19:38,315 DEBUG c.b.j.c.c.ClauseHelper: Builds predicate for clause WINDOW_FOREGROUND with expected value='Voer bewegingscode in'
2022-09-15 10:19:38,315 DEBUG c.b.j.c.c.AbstractCitrixClient: Adds a listener, Total: 1
2022-09-15 10:19:38,315 DEBUG c.b.j.c.c.s.c.ListeningStrategy: Starts listening Citrix windows events at 1663229978315 with timeout=10000
2022-09-15 10:19:48,327 DEBUG c.b.j.c.c.AbstractCitrixClient: Removes a listener, Total: 0
2022-09-15 10:19:48,327 DEBUG c.b.j.c.c.s.c.ListeningStrategy: Stops listening Citrix windows events at 1663229988327 with expired=true
2022-09-15 10:19:48,327 DEBUG c.b.j.c.s.CitrixBaseSampler: On sampler Klik verrekijker didn't get snapshot using strategy WINDOW_FOREGROUND
2022-09-15 10:19:48,342 DEBUG c.b.j.c.c.w.WinCitrixClient: Screenshot saved in ..
2022-09-15 10:19:48,358 DEBUG c.b.j.c.c.w.WinCitrixClient: Deletes screenshot ..
2022-09-15 10:19:48,358 DEBUG c.b.j.c.s.CitrixBaseSampler: On sampler Klik verrekijker created a default snapshot WINDOW_FOREGROUND
2022-09-15 10:19:48,412 ERROR c.b.j.c.s.CitrixBaseSampler: Sample error CLAUSE_TIMEOUT
com.blazemeter.jmeter.citrix.sampler.SamplerRunException: Check of end clause has failed.
at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.checkClause(CitrixBaseSampler.java:244) ~[citrix-jmeter-0.7.6.jar:?]
at com.blazemeter.jmeter.citrix.sampler.CitrixBaseSampler.sample(CitrixBaseSampler.java:274) ~[citrix-jmeter-0.7.6.jar:?]
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.5]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.5]
at java.lang.Thread.run(Thread.java:834) ~[?:?]
2022-09-15 10:19:48,412 DEBUG o.a.j.t.TestBeanHelper: Preparing class org.apache.jmeter.extractor.JSR223PostProcessor
2022-09-15 10:19:48,412 DEBUG o.a.j.t.TestBeanHelper: Setting scriptLanguage=groovy
2022-09-15 10:19:48,412 DEBUG o.a.j.t.TestBeanHelper: Setting parameters=
2022-09-15 10:19:48,412 DEBUG o.a.j.t.TestBeanHelper: Setting filename=
2022-09-15 10:19:48,412 DEBUG o.a.j.t.TestBeanHelper: Setting cacheKey=true
2022-09-15 10:19:48,412 DEBUG o.a.j.t.TestBeanHelper: Setting script=import com.blazemeter.jmeter.citrix.sampler.CitrixSessionHolder;
import com.blazemeter.jmeter.citrix.client.CitrixClient;
import com.blazemeter.jmeter.citrix.client.WindowInfo;
import com.blazemeter.jmeter.citrix.client.handler.CitrixClientHandler;

String windowTitle = "";

log.info("@@@@@@@@@@@@@@@@@@@@@@@@@ Window titels @@@@@@@@@@@@@@@@@@@@@@@@@");

CitrixClient client = CitrixSessionHolder.getClient();
if (client != null) {
log.info(sprintf("@@@@@@@@@@@@@@@@@@@@@@@@@: %s", "client != null"));
log.info(sprintf("@@@@@ Klik verrekijker"));

client.getWindowInfos().forEach((window) -> {
	String title = window.getCaption();
	log.info(sprintf("@@@@@ Window: %s", title));
});

}

return true

2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@@@@@@@@@@@@@@@@@@@@@ Window titels @@@@@@@@@@@@@@@@@@@@@@@@@
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@@@@@@@@@@@@@@@@@@@@@: client != null
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Klik verrekijker
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window: ICA Seamless Host Agent
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window: C:\Windows\system32\cmd.exe
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window: DONNA Planbord -- 20220905-SD-20220911 : 20220905-SD-20220911
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window:
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window: Voer bewegingscode in
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window: Windows sign-in
2022-09-15 10:19:48,427 INFO o.a.j.e.J.JSR223 PostProcessor1: @@@@@ Window: UsrLogon.cmd
2022-09-15 10:19:48,427 DEBUG o.a.j.c.GenericController: Calling next on: class org.apache.jmeter.control.GenericController
`

ICA save folder set to D drive, does not obey JMeter property to change save location

Running existing script, JMeter logs attempted save folder and subsequent error in creating that folder:

2019-01-11 11:18:17,302 INFO c.b.j.c.l.CitrixIcaFileSaver: ICA File Saver  checking ICA save folder D:\devData\apache-jmeter-5.0\ica_files 2019-01-11 11:18:17,303 INFO c.b.j.c.l.CitrixIcaFileSaver: ICA File Saver  will create ICA save folder D:\devData\apache-jmeter-5.0\ica_files as it does not exist, creating 2019-01-11 11:18:17,307 ERROR o.a.j.JMeter: Uncaught exception: org.apache.jorphan.util.JMeterStopTestException: Element ICA File Saver failed to created ICA save folder D:\devData\apache-jmeter-5.0\ica_files at com.blazemeter.jmeter.citrix.listener.CitrixIcaFileSaver.testStarted(CitrixIcaFileSaver.java:178) ~[citrix-jmeter-0.3.0.jar:?] at com.blazemeter.jmeter.citrix.listener.CitrixIcaFileSaver.testStarted(CitrixIcaFileSaver.java:166) ~[citrix-jmeter-0.3.0.jar:?] at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:215) ~[ApacheJMeter_core.jar:5.0 r1840935] at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:384) ~[ApacheJMeter_core.jar:5.0 r1840935] at java.lang.Thread.run(Unknown Source) [?:1.8.0_191]

As per documentation, JMeter property is set in the user.properties file as:

bzm.citrix.ica_files_folder=C:\<jmeter home folder>\ica_files

but this doesn't change the behavior after JMeter restart.

Full jmeter.log

ICAClientAdapter Connection Failed

Hi,

My Script was working as expected. Earlier icon was without + Sign i.e.

Last day i believe due to some change in the Citrix, My application on Citrix has name +Sign Prefix to app name
image

Due to this change, i am facing this issue and a message box to contact administrator.

image

My machine has installed following Citrix Reciever

image

Would be great if you can tell me what cause this connection fail issue.
Thanks

java.io.NotSerializableException when trying to run CitrixPlugin on Remote

Enviroment Details:
Windows Server 2012 R2
Jmeter 5.4
citrix-plugin 0.7.3.
AdpoptJDK 11.0.10 (32-bit)
Citrix Workspace 1912

I can run Citrix Plugin Test Plans via the GUI and CLI, but when I try to run the test plan on a remote server, I get the following error:

Error in rconfigure() method java.rmi.MarshalException: error marshalling arguments; nested exception is:
java.io.NotSerializableException: com.blazemeter.jmeter.citrix.client.windows.WinCitrixClientFactory

I tried different version of JDK, and previous versions of JMeter but the error still occurs when I try to run the test plan on remote. Even a new Citrix Test Plan with only a manually added Citrix Element Launcher has the error.
NotSerializableError

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.