Jak używajac Watir/Ruby wpisać wartość w pole z Autopostback

Witam,

mam stronę napisaną w ASP z polem tekstowym z autopostback, jest to pole wyszukiwania, po wpisaniu wartości i wciśnięciu przycisku wyszukiwania pojawia się lista elementów spełniających kryteria wyszukiwania.
Moim celem jest napisanie z uzyciem Watir i Ruby automatu który będzie między innymi wpisywał wartość w pole i klikał przycisk.
Mam taki kod:

search=@brows.text_field(:id=>‘searchTextBox’)
search.set(name)
@btnSearch=@brows.button(:id=>‘searchButton’)
@btnSearch.click

Po uruchomienia zachowuje się on tak, że wpisuje wartość w pole, ale przed klinięciem przycisku wyszukiwania wartość znika i przekazywany jest pusty string.
Gdy to samo robię klikając po stronie manualnie, wartość wpisana w pole wyszukiwania nie znika.

Jak objeść problem ze znikającymi wartościami wpisanymi w pole?
Bardzo proszę o pomoc.

Pozdrawiam,
Marta

A czy tam przypadkiem nie ma jakiejś magii javascriptowej? Sprawdź manualnie czy wyszukiwanie działa bez włączonego javascriptu.

Prawdopodobnie chodzi o ukryte pole _VIEWSTATE - nie mam teraz tego przed soba, ale pamietam na 99%, że ASP.NET ustawia handlery na ‘submit’ formularza, kopiujac wartosc tego pola (ale nie pamietam teraz skad -> gdzie). Sprobuj znalezc w zrodle strony onclick/onsubmit i powielic ‘recznie’ te operacje w rubym.

Jest java script, w źródle strony to widać:

input name=“searchTextBox” type=“text” value=“wpisz frazę”
onchange=“javascript:setTimeout(’__doPostBack(‘searchTextBox’,’’)’, 0)” onkeypress=“if
(WebForm_TextBoxKeyHandler(event) == false) return false;” id=“searchTextBox” style=“width:159px;”

a submit wyglada tak:

input type=“submit” name=“searchButton” value=“Szukaj” id=“searchButton” style=“width:151px;”

W jaki sposób mogę powielić ten submit?

znajdz definicje funkcji __doPostBack. Jest wolana przez setTimeout z opoznieniem 0 przy kazdej zmianie wartosci pola (dla ciekawostki: opoznienie 0 to czesto stosowany trick, by nie blokowac glownego watku przegladarki, ale nadal ‘zlecic’ wykonanie wywolania funkcji po tym, jak przegladarka zakonczy swoj aktualny ‘run/render loop’)

1 Like

Czy chodzi o to aby nadpisać wywołanie __doPostBack moim wywołaniem na przykład:

__doPostBack(‘searchTextBox’,‘cos’)

i wpakować to do setTimeout z iina wartością niż 0:

setTimeout(’__doPostBack(‘searchTextBox’,‘cos’)’, 10)

?

Nie do konca - moim zdaniem musisz ‘zaemulowac’ to, co ta funkcja robi. Zdaje sie, ze to jakis standard:

http://aspalliance.com/articleViewer.aspx?aId=895&pId=-1

function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}

zatem przed zrobieniem ‘click’, sprobuj recznie ustawic wartosci pol hidden o nazwach __EVENTTARGET i __EVENTARGUMENT odpowiednio na ‘searchTextBox’ oraz ‘’

Witam,

dziękuję za pomoc.
Próbuje zrobić tak jak napisałeś. Ustawiając wartość pól hidden przed kliknieciem

@btnSearch=@browser.button(:id=>'searchButton')
@browser.hidden(:name=>'_EVENTTARGET', :value => 'searchTextBox')
@browser.hidden(:name=>'_EVENTARGUMENT', :value => 'cos')
@btnSearch.click

ale wartości te nie sa widoczne.
Próbowałam ustawiać inaczej, poprzez set, ale pojawia się błąd:
undefined method `set’ for #Watir::Hidden:0x2aa88a0 (NoMethodError)
Generalnie na polutypu hidden niewiele metod mozna wywołać.

ale zawsze mozna sobie ‘pomoc’ javascriptem :wink:
http://www.bofrede.com/2014/07/tamper-with-hidden-fields-using-watir-webdriver/

czyli sprobuj:

@browser.execute_script("
var search = document.getElementById('searchTextBox'); 
var f = search.form; 
f['__EVENTTARGET'].value = 'searchTextBox'; 
f['__EVENTARGUMENT'].value = ''; 
")

Mało ogarnięta programistycznie jestem, stąd idzie jak po grudzie :wink:
Próbowałam javascriptem wywoływać jeszcze raz doPostBack:

 @browser.execute_script('javascript:__doPostBack("searchTextBox","cos")')

ale nie działało tak jak chciałam :wink:

Działa w taki, nieelegancki sposób:

@search=@browser.text_field(:id=>'searchTextBox')
@search.value=''
@search2=@browser.text_field(:id=>'searchTextBox')
sleep(1)
@search2.append(name)
sleep(1)
@btnSearch=@browser.button(:id=>'searchButton')
@btnSearch.click 

Właśnie…próbowałam też tak jak w linku który podałeś:

@browser.execute_script("document.getElementById('_EVENTTARGET').value = 'searchTextBox';")

Ale dostaje błąd.

Spróbuje jeszcze powalczyć w taki sposób jak pokazałeś.

Witam ponownie.
odgrzebuję temat ponieważ chciałabym zrozumieć dlaczego wystąpił taki problem.

Dlaczego gdy wyszukuję manualnie autopostback w polu wyszukiwania działa poprawnie, a gdy robię to samo za pomocą Watir nie działa.
Jak robi to Watir?
Wydaje mi się, że przeładowuje stronę, ale dlaczego?
Czym różni się jego przeładowanie strony od mojego wpisania w pole jakiejś wartości i naciśnięcia F5?

Będę wdzięczna za wyjaśnienie przyczyny tego zjawiska.

Pozdrawiam,
Marta