Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有类似元素的Selenium Webdriver C#页面_C#_Class_Selenium_Webdriver - Fatal编程技术网

具有类似元素的Selenium Webdriver C#页面

具有类似元素的Selenium Webdriver C#页面,c#,class,selenium,webdriver,C#,Class,Selenium,Webdriver,我有4页,内容和功能非常相似。但是,这些元素都有不同的ID,具体取决于您所在的页面。目前,我已经按照如下方式构造了它们(示例类A和类B)。我想重构它,因为这两个类之间的所有方法都是相同的,但我不知道如何进行重构,因为元素具有不同的ID(我使用PageFactory,但我也愿意不使用它) 非常感谢您的任何见解 public class A : BaseClass { [FindsBy(How = How.Id, Using = "ALoginId"] public IWebElem

我有4页,内容和功能非常相似。但是,这些元素都有不同的ID,具体取决于您所在的页面。目前,我已经按照如下方式构造了它们(示例类A和类B)。我想重构它,因为这两个类之间的所有方法都是相同的,但我不知道如何进行重构,因为元素具有不同的ID(我使用PageFactory,但我也愿意不使用它)

非常感谢您的任何见解

public class A : BaseClass
{
    [FindsBy(How = How.Id, Using = "ALoginId"]
    public IWebElement Login {get; set;}

    [FindsBy(How = How.Id, Using = "APassword"]
    public IWebElement Password {get; set;}

    [FindsBy(How = How.Id, Using = "ALoginBtn"]
    public IWebElement LoginBtn {get; set;}

    public void Login()
    {
        Login.SendKeys("username");
        Password.SendKeys("password");
        LoginBtn.Click();
    }
}

public class B : BaseClass
{
    [FindsBy(How = How.Id, Using = "BLoginId"]
    public IWebElement Login {get; set;}

    [FindsBy(How = How.Id, Using = "BPassword"]
    public IWebElement Password {get; set;}

    [FindsBy(How = How.Id, Using = "BLoginBtn"]
    public IWebElement LoginBtn {get; set;}

    public void Login()
    {
        Login.SendKeys("username");
        Password.SendKeys("password");
        LoginBtn.Click();
    }
}

若有类似的其他字段,比如name,class,你们可以用它来代替id

此外,以下是您可以使用的方法:

public class A : BaseClass
{
    private String loginWindow;

    [FindsBy(How = How.Id, Using = "ALoginId"]
    public IWebElement Login {get; set;}

    [FindsBy(How = How.Id, Using = "APassword"]
    public IWebElement Password {get; set;}

    [FindsBy(How = How.Id, Using = "ALoginBtn"]
    public IWebElement LoginBtn {get; set;}

    [FindsBy(How = How.Id, Using = "BLoginId"]
     public IWebElement Loginb {get; set;}

    [FindsBy(How = How.Id, Using = "BPassword"]
    public IWebElement Passwordb {get; set;}

    [FindsBy(How = How.Id, Using = "BLoginBtn"]
    public IWebElement LoginBtnb {get; set;}

    public A(Srting loginwindow){
            this.loginWindow; = loginwindow;
    }

    public void Login()
    {
        if(loginwindow.equals("A")) {
            Login.SendKeys("username");
            Password.SendKeys("password");
            LoginBtn.Click();
         }
         elseif(loginwindow.equals("B")){
            Loginb.SendKeys("username");
            Passwordb.SendKeys("password");
            LoginBtnb.Click();
         }
        else{
            throws new Execption("Please provide correct login Window name")
         }
     }
}

请参见下面的示例

我的测试是

//MAximize the Screen
driver.manage().window().maximize(); 
//Go to Gmail Login Page
SignInPage SignInPage = WebUtils.GoToSignInPage(driver);
//Sign in to Login page -Send Username 
SignInPage.SendkeysMethodForSignInPAge(driver, By.cssSelector("input[id='Email']") , "kishanpatelllll.8@gmail.com" );
//Click on Next
SignInPage.ClickToLogin(driver, By.cssSelector("input[id='next']"));
//Wait for password field to be visible
SignInPage.WaitForElementTobeVisible(driver, By.cssSelector("input[id='Passwd'][type='password']"));
因此,当我调用sendKeysMethodForSigningPage方法时,我不会在@Test中编写它

请参阅SendKeysMethod以了解SigningPage方法:

public class SignInPage {

  public void SendkeysMethodForSignInPAge(WebDriver driver, By by, String s) {
WebUtils.Sendkeys(driver,by,s);
  }
}
所以sendkeys是一种常见的方法,它将在任何地方使用,所以它将在一个名为webutils的类中使用

public class WebUtils {
   public static void Sendkeys(WebDriver driver, By by, String s) {
        WebElement Element = driver.findElement(by);
        Element.clear();
        Element.sendKeys(s);
  }
}

我创建了一个新类,并在那里定义了它。这是基本流程。希望你能联系到这一点。回答我,如果你仍然被卡住。快乐学习:-)

你懂一点JAVA吗。我可以用JAVA来展示它,我只能说在[FindsBy(How=How.Id,Using=“ALoginId”]public IWebElement Login{get;set;}下保持Using=some变量并将Login改为元素:[FindsBy(How=How.Id,Using=string)public IWebElement{get;set;}现在,通过用户名、密码和登录按钮的3种不同方法传递此元素和字符串。抱歉,我不知道C#。希望您能理解它?请回答:-)我知道Java,因此如果您能给我一个示例,我将不胜感激。抱歉,答复太晚了。请查看我的答复。请随时询问您是否被卡住。工作量相同:(.我试图争取的是能够完成一次而不是多次登录功能。在上面的方法中,您只有一个登录功能是的,但我试图多次编写以下3行代码。{Loginb.SendKeys(“用户名”);Passwordb.SendKeys(“密码”);LoginBtnb.Click();}.问题是没有多个方法,但这些方法的内容基本相同。如果可能的话,这就是我试图避免的。