【问题标题】:Using Selenium WebDriver to retrieve the value of an HTML input使用 Selenium Web Driver 检索 HTML 输入的值
【发布时间】:2011-12-12 17:31:12
【问题描述】:

在 webapp 的 HTML 中有如下代码

<input type="text" name="prettyTime" id="prettyTime" class="ui-state-disabled prettyTime"  readonly="readonly">

页面上实际显示的是一个显示时间的字符串。

在 Selenium Web 驱动程序中,我有一个 WebElement 对象引用 &lt;input&gt; 使用

WebElement timeStamp = waitForElement(By.id("prettyTime"));

我想获取WebElement 的值,或者换句话说,打印在页面上的内容。我尝试了所有WebElement getter,但没有任何东西能检索到用户看到的实际值。有什么帮助吗?谢谢。

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

    试试element.getAttribute("value")

    text 属性用于元素标签内的文本。对于输入元素,显示的文本不被&lt;input&gt; 标签包裹,而是在value 属性内。

    注意:大小写很重要。如果您指定“值”,您将得到一个“空”值。至少对于 C# 来说是这样。

    【讨论】:

    • getAttribute("value")真的你是怎么做到的?!这没有任何意义。 input 元素的 value 属性与其value 属性之间存在很大差异。 Selenium 是否做了 jQuery 所做的可怕事情并将它们混为一谈?
    • 这就是我现在遇到的问题:试图从一个文本区域中获取一个值,它既不是“值”属性,也不是标签间文本(动态设置为“值”属性.
    • 嗯,原来如果缺少该属性,它会尝试获取对应的属性。因此,您可以从 textarea 中获取“值”。
    • 显然,这是我设法访问 angulat 材料表单字段的唯一方法
    • 对于javascript用户,使用getAttribute时不要忘记await
    【解决方案2】:

    你可以这样做:

    webelement time=driver.findElement(By.id("input_name")).getAttribute("value");
    

    这将为您提供在网页上显示的时间。

    【讨论】:

      【解决方案3】:

      使用硒 2,

      我通常是这样写的:

      WebElement element = driver.findElement(By.id("input_name"));
      String elementval = element.getAttribute("value");
      

      String elementval = driver.findElement(By.id("input_name")).getAttribute("value");
      

      【讨论】:

        【解决方案4】:

        对于 python 绑定,它将是:

        element.get_attribute('value')
        

        【讨论】:

        • 这是唯一适合我的答案! Mac OSX + Python 3.7.7
        【解决方案5】:

        按照我使用的@ragzzy 的回答

         public static string Value(this IWebElement element, IJavaScriptExecutor javaScriptExecutor)
            {
        
                try
                {
                    string value = javaScriptExecutor.ExecuteScript("return arguments[0].value", element) as string;
                    return value;
                }
                catch (Exception)
                {
                    return null;
                }
            }
        

        它工作得很好,不会改变 DOM

        【讨论】:

          【解决方案6】:

          如前所述,您可以做类似的事情

          public String getVal(WebElement webElement) {
              JavascriptExecutor e = (JavascriptExecutor) driver;
              return (String) e.executeScript(String.format("return $('#%s').val();", webElement.getAttribute("id")));
          }
          

          但是正如你所看到的,你的元素必须有一个id 属性,并且你的页面上还有jquery。

          【讨论】:

            【解决方案7】:

            element.GetAttribute("value");

            即使你在 html dom 中没有看到“value”属性,你也会得到显示在 GUI 上的字段值。

            【讨论】:

              【解决方案8】:

              如果输入值由涉及一些延迟的脚本(例如 AJAX 调用)填充,那么您需要等到输入填充完成。 例如

              var w = new WebDriverWait(WebBrowser, TimeSpan.FromSeconds(10));
                          w.Until((d) => {
                              // Wait until the input has a value...
              
                              var elements = d.FindElements(By.Name(name));
              
                              var ele = elements.SingleOrDefault();
              
                              if (ele != null)
                              {
                                  // Found a single element
              
                                  if (ele.GetAttribute("value") != "")
                                  {
                                      // We have a value now
                                      return true;
                                  }
                              }
              
                              return false;
                              });
              
                      var e = WebBrowser.Current.FindElement(By.Name(name));
              
                      if (e.GetAttribute("value") != value)
                      {
                          Assert.Fail("Result contains a field named '{0}', but its value is '{1}', not '{2}' as expected", name, e.GetAttribute("value"), value);
                      }
              

              【讨论】:

                【解决方案9】:

                JAVA 用户:

                要获取页面上打印的内容,我们需要使用 getText() 方法。

                getText() 方法

                getText() 方法返回网页元素的可见内部文本。

                getAttribute() 方法

                另一方面,getAttribute() 方法获取我们希望检索的属性的值。

                示例:

                &lt;input name="Title" type="text" value="LambdaTest" /&gt; Welcome to LambdaTest &lt;/input&gt;

                getText():

                driver.findElement(By.name("Title")).getText();
                

                以上代码的输出 => 欢迎来到 LambdaTest

                getAttribute():

                1. driver.findElement(By.name("Title")).getAttribute("value");

                  以上代码的输出 => LambdaTest

                2. driver.findElement(By.name("Title")).getAttribute("type");

                  以上代码的输出 => 文本

                src:https://www.lambdatest.com/blog/how-to-get-text-of-an-element-in-selenium/#Difference

                【讨论】:

                • 在 html 中无效, 也一样 Welcome to LambdaTest 。输入是一个自闭标签,不允许有任何孩子。
                【解决方案10】:

                这有点骇人听闻,但确实有效。

                我使用JavascriptExecutor 并在HTML 中添加了div,并将div 中的文本更改为$('#prettyTime').val() 然后我使用Selenium 检索div 并获取它的值。在测试了值的正确性后,我把刚刚创建的div去掉了。

                【讨论】:

                • 这不应该是公认的答案。即使使用 JS,您也可以执行并返回它(而不是弄乱 DOM)。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-06-27
                • 2021-10-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多