I have very little experience with Windows platform and I really need a tool to test my application from the UI side. Quick i-net search make me completely baffled, so any help is highly appreciated.
Key requirements:
Can fire user-driven events (such as click on specific place, drag'n'drop, text input)
Can capture screenshots (e.g. on failure)
Can analyze screenshots (sometimes application fires random events and creates pop-ups, needs to intercept and handle such situations).
Maybe I can delegate this to some third-party process?
Can create reports and store them in file system.
Application itself is written on C#, but it doesn't matter, right?
If you're developing with WPF (or even WinForms), I'd give Microsoft UI Automation a shot. In conjunction with MSUnit or NUnit it allows easy and programmable UI tests.
Nunit is good for functional & Logic testing, its 3rd Party and free to Install. But I dont think it will cover capturing Screenshots etc.
Related
I'm attempting to write a application in C# utilizing the Microsoft UI Automation framework. The application to be controlled uses a component called "FarPoint Spread". It's easy enough to automate the rest of the application (e.g. its WinForms controls), but I can't seem to do anything with the FarPoint Spread control.
I'm still very green when it comes to programming. I've got just the basics of C# and UI automation down. Just need someone to point me to the information I need to have to automate this Spread component (if that's even possible). Thanks!
The problem is the grid rendering in Spread is written probably using custom code, and it's not equipped with what UI Automation expects.
I have tested the Sample Explorer provided by GrapeCity here (http://spread.grapecity.com/Pages/Demos/) with UI Automation's Inspect tool, and once you get to the data grid itself, there's nothing shown in Inspect.
There's also this topic in GrapeCity's forums:
Is Spread even supported in coded UI test which clearly states (2 years ago) it's not supported (as you known VS Coded UI also uses UI Automation as the underlying technology).
So, I guess it's not possible to automate Spread using UI automation (maybe they have their own system, you'd have to contact them).
i need to block any screen capture software on the computer from taking screen shots. Since all of them are work on standard API-functions, i think i could monitor and block them.
I need to use C#.
All i have found is how to monitor and block them in a certain program (screen capture program). They are looking for a function in the program, then they change it address on mine function address.
But how can i do it, if i haven't any certain programs? I need to block anyone which tries to take a screenshot.
If your final goal is possible or not I don't know, but for the hooking the API portion I can help you out.
I have used the library EasyHook many times in the past, this will let you hook and intercept system function calls from C# code fairly easily. Just read through the PDF tutorial for setup instructions.
For actually finding the API's I recommend Rohitab's API Monitor, it's still in Alpha stages but it works really well and is free. You just hook it on to a processes and it tells you every external DLL call it makes (with the parameters it passed if you have the xml definition file for the DLL, the program comes with almost all of the windows API dll's pre-defined).
The combination of EasyHook and API Monitor is a great 1-2 punch for mucking with other program's calls.
It is not possible to prevent screenshots from being taken. The battle is already lost because of the DWM (Desktop Window Manager). It's lower level than Win32 and device contexts.
If you want to protect the text in your program, there are a lot easier ways to extract it than doing screenshots and OCR. TextOut and/or Direct2D hooking and accessibility APIs.
If there's a lot of IP in your program. Then don't make it all available onscreen. Make sure it's tedious to crawl the GUI for text, and hard to automate it. And don't load whole texts in memory of the program.
Possible solutions:
1. To prevent copying of text. Draw the text as an image.
2. To prevent accessibility technologies, like screen readers - override WndProc in your control, handle and ignore the window message WM_GETOBJECT.
3. To make it harder if they try to use OCR. Draw graphics behind the text. Human readable, but much harder for a machine to interpret it.
Neither of these methods are invasive for the user.
** A very invasive suggestion **:
If you are really serious about preventing anyone from "stealing" your content.
Implement mouse and keyboard hooks. Filter out typical copy shortcuts. Prevent the mouse from leaving the boundaries of your application.
Allow your application to only run when the OS runs well-known processes and services.
If any process starts which you don't recognize, black out the application and notify the user about it, and request the user to close it. And ofc make sure someone is not just spoofing a well-known process.
Monitor the clipboard as you suggested yourself.
You can ofc soften some of these suggestions based on the context of your application.
As Scott just posted it likely can be prevented with API hooks to see that paint events only go to desktop bound handles and not others, and refuse to paint otherwise. However, you need to consider the following scenarios and see if they're relevant threat to your approach or not:
Your software may be running in a virtual machine like VMWare. Such software has capapbilities to capture screen that does so at "virtual hardware" level, and your API hooks will not be able to discern it - and this would be the easiest way approach if I wanted to bypass your protections.
As a post suggests here, nothing also prevents someone to take monitor cable and plug it into another computer's capture card, and take screenshot that way. Again, your hooks will be helpless here.
Bottom line, you can make it somewhat harder to do, but bypassing such protection may be pretty trivial thing to do.
My 2c.
I'm looking to automate the GUI available for TortoiseSVN. Rather than using the one provided and manually inputting the urls, I would like to save off various urls that I switch to on a daily basis and at the click of a button switch my working copy to one of my choosing.
TortioseSVN's 'TortioseProc.exe Switch' command does not support the /url parameter until a future release (1.8), this prevents me from being able to embed these easily within an anchor tag (supported by Tortiose) somewhere on our intranet.
Using the standard svn CLI thats compatible with the 1.7 build I'm able to perform switches and automatically close the command line, however I don't know of a way to perform these from a web interface and as I'm not familiar with desktop development I don't know of a plausible desktop solution.
I'm coming to you StackOverflow in hopes you know of a lightweight desktop alternative that wouldn't require much setup on the users side or better yet (web developer by trade) a web solution.
I want to clarify, I'm not looking for actual code but a library or language that will allow me to meet these requirements as I'm hoping to open this solution up to more developers at my workplace and would rather something that allows easy adoption (not a messy setup).
Thanks!
From a Windows/.NET application (whether it be ASP.NET within IIS, or a standalone application), your best way to go is SharpSVN.
Second place would be to write a wrapper around the command-line client.
I'm trying to embed Windows-Sidebar-Widgets into my own .Net Application (WPF and C#), but I dont't realy know where to start. I googled a bit but only found SDK and tutorials for widget-development. I found that there is a small service in Windows, running the widgets. My thought was that I could perhaps fake this service and provide his functions whithin my programm, so that I can run and show the widgets.
Does anyone have some tips on how to do this? Or some experience in doing so? Perhaps there is even some kind of libary for that kind of stuff?
If this is not possible it is also an option to switch to an OpenSource widged-manager to use this widgeds, but this is only an emergency solution and the windows-gadgeds would be very appreciated.
Some information about my system:
I've written some kind of small windowmanager for childwindows in my application. And on the top of this I want to show the widgets in some kind of HostWindow.
Any hint will be appreciated.
P.S.: I would be willing to share the results if I (or we) get this working :-)
I've never seen a library for hosting gadgets, but since they are basically just websites you could use the MSHTML component to host any arbitrary gadget in theory.
This isn't to say it will be easy.
You'll need to extract a gadget to some temporary directory, spin up something hosting MSHTML (in WinForms WebBrowser would be convenient), navigate to the appropriate file in that temp directory (discovered by parsing gadget.xml), and shove something resembling the System object into the gadget.
As a starting point, inject some script that sets System = window.external; onload and WebBrowerser.ObjectForScripting = new FakeGadgetSystem().
FakeGadgetSystem will need [ComVisible(true)] and to implement a decent amount of stuff. I'd advise grabbing a widget or two to test with that mildly exercise the Gadget API, and then slowly implement the calls they make. It'll be a long haul for 100% compatibility with the official gadget hosting service.
I know that you can create a separate console application, however, I am in the final stages of testing and my application does not have an interface. Is there a way to simply open a console and interact with that inside the desktop application? This would be in a test method. (I am using C#, in Visual Studio 2008).
Thanks,
badPanda
You might be able to do what you want using AllocConsole (creates a new console) or AttachConsole (attaches to an existing console), but I think there are some limitations to what you can do with them.
See here for the API documentation for AllocConsole and here's the PInvoke page.
Here's a list of lots of Console functions, might be something else useful there too.
This may or may not be helpful, but some of the same techniques of GUI testing can be applied to a console app too, of course.
Here is an article and example code in C# for a user interface test.
Or there are totally different tools/languages that can be used for UI testing, such as AutoIt v3, which is easy to learn and apply. AutoIt does have a DLL/COM control that you can access from your preferred programming language (but I haven't used it that way so I can't comment on how well it works).