Program do uzupełniania pól na stronach internetowych.

0

Witam,

To jest mój pierwszy temat jak i post na forum więc proszę o wyrozumiałość ;)
Otóż mam ochotę ułatwić sobie życie przez program wspierający moją wakacyjną pracę. Chodzi o to że wypełniam formularze stałym schematem i po dłuższym czasie sięganie po myszkę i przechodzenie do konkretnych okienek (nie wszystkie mają być wypełnione) staje się uciążliwe i czasochłonne. I teraz do rzeczy, otóż nie mam zielonego pojęcia jak wykonać taki program który po zatwierdzeniu wpisanego pola będzie przechodził do następnego które należy wypełnić. Zastanawiam się czy wystarczy na głupiego z tablicy ASCII odpowiednią ilość razy kazać nacisnąć TAB czy też drugi raz na głupiego wskazywać położenie pól i program miał by automatycznie klikać myszką (na stałe ustawione koordynaty pół "x","y"). Nie przychodzę tutaj po gotowca ale po wskazanie właściwej drogi lub po podpowiedź co do rozwiązania (według mnie nie ma przyjemności z napisania i korzystania z programu dy zostanie "przeklejony" z forum :P

Formularz jest na stronie internetowej oraz obsługiwany jest tylko przez IE.

EDIT: Po tym jak już będzie poprawnie uzupełniać pola zamierzam go podpiąć pod bazę Oracla więc musimy wziąć to pod uwagę.

Z góry dzięki! :)

0

Jeżeli nie musi być to c++ (bo jak zakładam ma to być tylko taka aplikacja pomocnicza) to może selenium? http://docs.seleniumhq.org/

0

Czemu nie tylko widzisz, problem jest po tej stronie że język C++ już znam naprawdę dobrze (zasługa wspaniałego nauczyciela z technikum :>) a w Selenium dochodzi nauka od nowa wszystkich instrukcji, pętli, warunków itd a przydało by się napisać ten program jak najszybciej. Jeżeli jesteś w stanie mi w tym pomóc to chętnie spróbuję :P Mam tylko jedno pytanie co do tego programu, jak z podłączaniem go do bazy Oracle'owej?

0

Jak nie musisz pisać to spróbuj coś gotowego użyć, http://www.roboform.com/support/manual/roboform#custom to np. wygląda obiecująco

http://kurs-c-plus-plus.cba.pl/?page_id=352 tutaj jakiś krótki poradnik na temat kody który symuluje naciśnijęcie przycisku (jeżeli wiesz że forumlarze się nie zmieniają kolejnością)

Edit:
to też da się przerobić //4programmers.net/Forum/C_i_C++/197153-symulacja_nacisniecia_klawisza_a , post na samym dole najlepiej

0

Akurat tak się składa, że muszę pisać bo później cała reszta musi współpracować z dużą bazą danych Oracle'a (ponad 160 tysięcy pozycji i codziennie rośnie). Mój problem głównie polega na tym, że nie mam bladego pojęcia jak przenieść to co wpiszę i pobierze program okienkowy (nie konsolowy) na formularz na stronie internetowej.

0

Pozwól na odpowiedź w innym języku. Są tu trzy podstawowe funkcje do obsługi kontrolek IE i małe demo na końcu.

#include <mshtml.h> // todo: wywalić te 3 to stdafx.h
#include <tchar.h>
#include <oleacc.h>
#pragma comment(lib,"oleacc.lib")
#pragma comment(lib,"uuid.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"oleaut32.lib")
#pragma comment(lib,"ole32.lib")

// 1. mając uchwyt kontrolki browsera IE, szukamy odpowiedniego okienka child
// HWND FindBrowserControl(HWND hwndParent, int index=0);
// zaczynamy z indeksem zerowym. Jeżeli funkcja zwróci wartość niezerową i okaże
// się, że jednak to nie jest ta kontrolka browsera (bo mamy ich kilka),
// to zwiększamy index i szukamy od nowa.
// hwndParent może wskazywać na okno przeglądarki, lub nawet na pulpit.
struct FBC{int index;HWND hwndBrowser;};

static BOOL CALLBACK FindBrowserControlCB(HWND hwnd,LPARAM lParam)
{
	TCHAR classname[32];
	if (GetClassName(hwnd, classname, 32)==24 && !_tcscmp(classname, TEXT("Internet Explorer_Server")))
	{
		if ( !((FBC*)lParam)->index-- )
		{
			((FBC*)lParam)->hwndBrowser = hwnd;
			return FALSE; // zakończ enumerator
		}
	}
	return TRUE; // szukaj dalej
}

HWND FindBrowserControl(HWND hwndParent, int index=0)
{
	FBC param = {index,0};
	EnumChildWindows(hwndParent, FindBrowserControlCB, (LPARAM)&param);
	return param.hwndBrowser;
}

// Zamieniamy uchwyt okna "Internet Explorer_Server" na IHTMLDocument2*
// IHTMLDocument2 *document;
// if (SUCCEEDED(BrowserHandleToDocument(hwndBrowser, &document)))
// {
//    ...
//    document->Release(); // gdy document nie jest już potrzebny
HRESULT BrowserHandleToDocument(HWND hwndBrowser, IHTMLDocument2 **ppv)
{
	UINT uMsg = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT"));
	LRESULT result = SendMessage(hwndBrowser, uMsg, 0, 0);
	return result ? ObjectFromLresult(result, IID_IHTMLDocument2, 0, (void**)ppv) : E_NOINTERFACE;
}

// mając IHTMLDocument2*, można zrobić wszystko z zawartością HTML
// DocumentSetElementText(document, L"login", L"administrator");
// ElementId pobieramy ze źródła strony: <input name="login" ...
HRESULT DocumentSetElementText(IHTMLDocument2 *document, LPCWSTR pszElementId,LPCWSTR text)
{
	IHTMLDocument3 *doc3;
	HRESULT hr = document->QueryInterface(IID_IHTMLDocument3, (void**)&doc3);
	if (SUCCEEDED(hr))
	{
		IHTMLElement *element = NULL;
		// SysAllocString można pominąć jeżeli kontrolka należy do tego procesu
		BSTR bstrId = SysAllocString(pszElementId);
		hr = doc3->getElementById(bstrId, &element);
		SysFreeString(bstrId);

		// Uwaga! większość metod mshtml (ponad IDispatch) może zwrócić S_OK i zerowy objekt
		if (SUCCEEDED(hr) && !element) hr = E_FAIL;
		if (SUCCEEDED(hr))
		{
			BSTR bstrText = SysAllocString(text);
			hr = element->put_innerText(bstrText);
			SysFreeString(bstrText);
		}
		doc3->Release();
	}
	return hr;
}

// przykładowo - we wszystkich kontrolkach IE wkleimy przykładowy tekst
// do pierwszego pola "szukaj" o typowej nazwie "q" (jaki jest na 4programmers)
extern "C" int main()
{
	CoInitialize(0);
	int index = 0;
	HWND hwndBrowser;

	while (hwndBrowser = FindBrowserControl(GetDesktopWindow(), index++))
	{
		IHTMLDocument2 *document;
		if (SUCCEEDED(BrowserHandleToDocument(hwndBrowser, &document)))
		{
			DocumentSetElementText(document, L"q", L"Moje Szukanie");
			document->Release();
		}
	}
	CoUninitialize();
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1