【问题标题】:Selenium Webdriver: Cant find element by classnameSelenium Webdriver:无法按类名查找元素
【发布时间】:2020-05-19 15:46:04
【问题描述】:

我目前正在努力使用 Selenium 通过其类名来选择一个元素。 我正在使用的网站是:

http://demo.guru99.com/test/login.html
<div class="col-xs-12 col-sm-6">
            <form action="success.html" method="post" id="login_form" class="box">
                <h3 class="page-subheading">Already registered?</h3>
                <div class="form_content clearfix">
                    <div class="form-group">
                        <label for="email">Email address</label>
                        <input class="is_required validate account_input form-control" data-validate="isEmail" type="text" id="email" name="email" value="">
                    </div>
                    <div class="form-group">
                        <label for="passwd">Password</label>
                        <span><input class="is_required validate account_input form-control" type="password" data-validate="isPasswd" id="passwd" name="passwd" value=""></span>
                    </div>
                    <p class="lost_password form-group"><a href="#" title="Recover your forgotten password" rel="nofollow">Forgot your password?</a></p>
                    <p class="submit">
                        <input type="hidden" class="hidden" name="back" value="my-account">                     <button type="submit" id="SubmitLogin" name="SubmitLogin" class="button btn btn-default button-medium">
                            <span>
                                <i class="icon-lock left"></i>
                                Sign in
                            </span>
                        </button>
                    </p>
                </div>
            </form>
        </div>

我想出了如何按 id 选择元素,但是每当我尝试按类名选择它时,我都会得到一个 element not found 异常。我真的不明白这是如何工作的,因为我尝试了多个网站但没有成功。在此示例中,元素具有多个类,但在某些网站上,当只有一个类时,此方法甚至会失败。在这个网站上,只有一个类可以选择它,但我读到这不是一个好方法,因为您可能会错误地选择多个元素。

IWebElement search = driver.FindElement(By.ClassName("account_input"));

这是我的代码:

driver = new ChromeDriver();          
driver.Url = "http://demo.guru99.com/test/login.html";
driver.Navigate();
IWebElement search = driver.FindElement(By.ClassName("is_required.validate.account_input.form-control"));
search.SendKeys("test");

在此示例中,使用 By.Id("first_name") 方法按 Id 选择元素也不起作用:

<span>
      <label class="first_name_label form_label_text"></label>
                <div class="clear"></div>
                <div class="form-item icon">
                  <input value="" data-error="An error has occured." id="first_name" type="text" name="first_name" class="form_item  is_required" placeholder="First Name">
                  <i style="color:rgba(70,75,106,0.5)" class="vs icon-user"></i>                </div>
                                <div class="form-item icon">
                  <input value="" data-error="An error has occured." id="last_name" type="text" name="last_name" class="form_item  is_required" placeholder="Last Name">
                  <i style="color:rgba(70,75,106,0.5)" class="vs icon-user"></i>                </div>
<div class="clear"></div>
</span>

我做错了什么?非常感谢您的帮助

【问题讨论】:

  • 你不能使用复合类名来定位元素使用classname
  • 嗯感谢您的反馈。我已经编辑了帖子。在第二个示例中,由于某种原因,我也无法通过 Id 选择它。我很困惑。
  • 它应该与id一起使用适当的等待。
  • driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); 等待10秒,由于某种原因仍然无法使用。
  • 尝试使用webdriverwait

标签: c# selenium selenium-webdriver selenium-chromedriver webautomation


【解决方案1】:

更正的代码:您的类名的 Xpath 不正确。

driver = new ChromeDriver();          
    driver.Url = "http://demo.guru99.com/test/login.html";
    driver.Navigate();
    IWebElement search = driver.FindElement(By.ClassName("is_required validate account_input form-control"));
    search.SendKeys("test");

访问电子邮件字段的另一种方法是:

IWebElement search = driver.FindElement(By.Xpath("//*[@id='email']"));

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你也可以使用类名来查找元素,但问题是在程序中可以使用同一个类来定义多个元素,所以当你逐类查找元素时它不能保证你会找到你想要的元素。 Selenium 会在结果中找到第一个元素。

    最好将 xpath 之类的标签与类一起使用。 这是代码

    xpath = " //输入[@name='passwd'] ";

    @ -> 可用于获取标签内的任何参数并根据您的要求使用它。

    这将对您有所帮助。 联系以获取更多信息。

    【讨论】:

      【解决方案3】:

      如果你会观察元素的类名,它是复合类名(中间有空格)。 selenium 中不允许使用复合类名。在这种情况下,您可以使用其他定位器,例如 CSS(带类名)或 XPath。

      检查以下代码sn -p:

      WebDriverManager.chromedriver().version("2.40").setup();
      WebDriver driver= new ChromeDriver();
      driver.manage().window().maximize();
      driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
      driver.get("http://demo.guru99.com/test/login.html");
      WebElementuserName=driver.findElement(By.cssSelector(".is_required.validate.account_input.form-control"));
      userName.sendKeys("Username");
      WebElement password = driver.findElement(By.xpath("(//[@class='is_requiredvalidateaccount_input form-control'])[2]"));
      password.sendKeys("Password");
      

      【讨论】:

        猜你喜欢
        • 2015-01-18
        • 2020-03-05
        • 2021-03-05
        • 2023-01-03
        • 1970-01-01
        • 2013-01-21
        • 2022-11-05
        • 1970-01-01
        相关资源
        最近更新 更多