2016-12-27 7 views
0

sind Ich möchte auf einen Link von vielen, die auf der Webseite verfügbar sind, und ich hatte einen Code geschrieben, wo ich Switch Case, die ist unten angegeben. Kann mir jemand sagen, können wir Enum oder andere Wege benutzen, um auf einen bestimmten Link zu klicken? Und im Gegenzug wird es Pageobject geben.In C# Webdriver, Ich möchte auf einen Link von vielen klicken, die auf der Webseite

Der Code, den ich mit zwei Links mit Schaltergehäuse verwenden,

public Object SelectMenu(string menuName) 
{ 

    Object result = null; 

    IWebElement menuTemp = driver.FindElement(By.XPath(".//a[contains(text(),'" + menuName + "')]")); 

    if (menuTemp.Enabled) 
    { 
     menuTemp.Click(); 
     if (menu.ToUpper() == "COUNTRY") 
     { 
      result = new CountryPage(driver).Load(); 
     } 

     else if (menu.ToUpper() == "PARTNER") 
     { 
      result = new PartnerPage(driver).Load(); 
     } 

Antwort

0

Suchen Sie so etwas?

string menu = "country"; 

     switch (menu.ToUpper()) 
     { 
      case "COUNTRY": 
       result = new CountryPage(driver).Load(); 
       break; 
      case "PARTNER": 
       result = new PartnerPage(driver).Load(); 
       break;     
     } 
+0

siehe meinen Code, MenüTemp ist Link und wenn der 30 Link, so dass ich 30 Fälle schreiben und nach dem Klicken auf den Code werden wir zurück Im Gegenzug auf der Seite, die Sie auch in Ihrem Code geschrieben haben, ist die anythig, die dis-Code reduzieren kann. – Harshit007

0

Wenn Sie nicht über die Klassen tippen möchten, die Sie instanziiert erwarten würde, aber die Benennung der menuitems und Ihre ... Page-Klasse steht im Einklang Sie Ihre Seitentypen mit Reflektion nachschlagen können und binden an die Konstruktor und Load-Methode. Ein Beispiel für einen solchen Ansatz ist dies:

var menu = "Country"; 
var pageClass = (from asm in AppDomain.CurrentDomain.GetAssemblies() 
      from pageType in asm.GetTypes() 
      let ctor = pageType.GetConstructor(new [] {typeof(IWebDriver)}) 
      let load = pageType.GetMethod("Load", Type.EmptyTypes) 
      where pageType.Name.EndsWith("Page") 
      && pageType.Name.StartsWith(menu, StringComparison.InvariantCultureIgnoreCase) 
      && ctor != null 
      && load != null 
      select new { Constructor = ctor, Load = load}).Single(); 

var page = pageClass.Constructor.Invoke(new []{webdriver}); 
var result = pageClass.Load.Invoke(page, null); 
// result has now your CountryPage instance 

Wie funktionierts:

von GetAssemblies alle Baugruppen in dem Prozess aufrufen kann wiederholt werden und GetTypes gibt alle öffentlichen Typen aufrufen.
Sie benötigen, dass Ihre Seitenklassen den IWebDriver im Konstruktor akzeptieren, sodass jeder Typ für diesen mit dem Aufruf GetConstructor abgefragt wird. Eine Anforderung wird mit GetMethod für die Lastanforderung erledigt.
Das letzte, was zu tun ist, zu überprüfen, ob der Name des Typs der Konvention entspricht, mit Seite zu enden und mit dem Menuname zu beginnen.
Im letzten Schritt wird ein einzelner (und nichts mehr) Artikel zurückgegeben. Von diesem Ergebnis können wir den Typ durch Aufruf von Invoke und anschließend invoke method für das Load-Mitglied erstellen.
Dieses Endergebnis wird zurückgegeben.

Beachten Sie, dass Sie zwei Typen finden, wenn Sie einen Typ CountryCityPage erstellen. Ich überlasse es als eine Übung für den Leser, um eine Lösung für diese

Verwandte Themen