2013-04-30 2 views
5

Ich habe eine Textbox, die Onkeypress-Ereignis hat, die eine Seite rendert, wenn der Wert in Textfeld eingegeben wird. Hier benutze ich Selen-Webdriver, um die Textbox zu füllen. Bevor ich die Textbox ausfülle benutze ich textbox.clear(). So wird das onkeypress-Event aufgerufen und die Seite gerendert. Daher wird das Textfeld-Steuerelement aus der Webdriver-Instanz entfernt.Probleme beim Senden von Text an ein Textfeld, das onkeypress Ereignis mit C# selen webdriver

Nach dem onkeypress-Ereignis wird das Element nicht im Webdriver aufgelistet. Dies ist die Quelle-Tag des jeweiligen Textbox:

<input id="ctl00_ctl00_ContentPlaceHolder1_cphMainContent_wzrDREvent_txtNftnTime" class="OpCenter_DateBox" type="text" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ctl00$ContentPlaceHolder1$cphMainContent$wzrDREvent$txtNftnTime\',\'\')', 0)" name="ctl00$ctl00$ContentPlaceHolder1$cphMainContent$wzrDREvent$txtNftnTime"> 

Und Sie können die onkeypress Veranstaltung hier gebraucht. Bitte schlagen Sie einige Ideen zum Füllen der Werte in der Textbox vor.

ich den folgenden Code bin mit meinem Textfeld zu füllen:

element.Clear(); 
element.SendKeys(value); 

Vielen Dank im Voraus.

+0

versuchen, mehrmals auf die Rücktaste (mit win32 ole) zu schlagen und dann den Text vielleicht senden? Ich weiß nicht, Mate es scheint, dass Sie wirklich stuck! –

+0

Ich glaube, du hast meine Frage falsch verstanden. Ich benutze Selenium web driver und mache den Automatisierungstest. Ich kann die Rücktaste nicht drücken, während der Test läuft. – Naren

+0

Können Sie bitte den Selenium-Code angeben, den Sie gerade verwenden, um Eingaben an die von Ihnen gepostete Eingabebox zu senden? – Nashibukasan

Antwort

2

Ich habe den folgenden JavaScript-Code verwendet, um dieses Problem zu beheben.

if (!(webDriver.GetType().FullName).Contains("IE")) 
      { 
       // To stop the page postback in Firefox and chrome 
       ((IJavaScriptExecutor)webDriver).ExecuteScript("window.stop();"); 
      } 

Der obige Code stoppt die Seitenladung und es funktioniert perfekt.

Allerdings funktioniert dieses JavaScript in Firefox 23.0 und höher nicht. Ansonsten funktioniert das JavaScript für Chrome 31.0 und IE 9 einwandfrei.

+0

Würde ein Postback nicht anhalten, um das Anwendungsverhalten zu ändern? – Faiz

+0

@Faiz: Das Anwendungsverhalten muss so sein. Es sollte ein Postback-Ereignis haben, während das Test-Textfeld geändert wird. – Naren

+0

genau - wenn Sie 'window.stop()' verwenden, halten Sie die Anwendung an, was sie tun soll. Das Postback ist aus einem bestimmten Grund da - zum Beispiel: es könnte eine Validierung durchführen; Sie sollten es nicht stoppen, um Ihren Tests zu entsprechen. – Faiz

5

Wahrscheinlich sehen Sie sich das onchange Ereignis an, das ausgelöst wird, wenn Sie clear() ausführen.

Eine Lösung besteht darin, Text in einer Aktion und nicht in separaten Aufrufen zu löschen und festzulegen. Sie können dies tun, indem Sie die Actions Klasse verwenden, die unten C# Erweiterung Methode zeigt, wie.

Das onchange-Ereignis wird ausgelöst, sobald Sie den Fokus vom Textfeldelement verlieren.

public static class WebElementExtensions 
{ 
public void ClearAndSetText(this IWebElement element, string text) 
{ 
    Actions navigator = new Actions(driver); 
     navigator.Click(element) 
      .SendKeys(Keys.End) 
      .KeyDown(Keys.Shift) 
      .SendKeys(Keys.Home) 
      .KeyUp(Keys.Shift) 
      .SendKeys(Keys.Backspace) 
      .SendKeys(text) 
      .Perform(); 
} 
} 
0

JS Injektion ist keine weise Lösung die ganze Zeit, ich würde vorschlagen, Sie mit @ Faiz.Also, schreiben einen Code für ein Szenario-spezifische oder Seite spezifische wird Ihnen enorme Schmerzen in der Wartungsphase.

Verwandte Themen