【问题标题】:How to extract the text of a text node that is not inside a tag of its own using Selenium and Java?如何使用 Selenium 和 Java 提取不在其自身标签内的文本节点的文本?
【发布时间】:2020-03-25 06:51:19
【问题描述】:

我想得到一行文本(例如standard_user)。我该怎么做?

<div id="login_credentials" class="login_credentials">
              <h4>Accepted usernames are:</h4>

              standard_user
<br>
              locked_out_user
<br>
              problem_user
<br>
              performance_glitch_user<br>

            </div>

【问题讨论】:

    标签: javascript java selenium xpath css-selectors


    【解决方案1】:

    文本 standard_user 是一个 文本节点,在 &lt;div&gt; 节点中。因此,要提取文本 standard_user,您可以使用以下任一 Locator Strategies

    • 使用cssSelector

      System.out.println((String)((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[2].textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.login_credentials#login_credentials")))));
      
    • 使用xpath

      System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[2].textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='login_credentials' and @id='login_credentials']")))).toString());
      

    【讨论】:

      【解决方案2】:

      收集一个div中包含的所有文本,并用换行符分隔:

      WebElement element = driver.findElement(By.id("login_credentials"));
      String lines[] = element.getText().split("\n");
      System.out.println(lines[1]);
      

      【讨论】:

        【解决方案3】:

        只需获取 div 内容并使用换行符进行一些字符串操作。

        String text=driver.findElement(By.cssSelector("div#login_credentials")).getText();
        String lines[] = text.split("\\r?\\n");
        System.out.println(lines[1]);
        

        【讨论】:

          【解决方案4】:

          我会使用几行来处理文本——&lt;br&gt; 元素和包含部分文本的元素有点棘手:

          // first, get all the text by locating div element
          string allText = driver.findElement(By.id("login_credentials")).getText();
          
          // then get H4 text so we can remove this string
          string textToRemove = driver.findElement(By.xpath("//div[@id='login_credentials']/h4")).getText();
          
          // remove unwanted "Accepted usernames are:" text
          string filteredText = allText.Replace(textToRemove, "");
          
          // split filteredText on newline regex so we can get line items including 'standard_user'
          string[] textArray = filteredText.split("\\r?\\n");
          
          // get standard_user text by getting first item in the split array
          string standardUserText = textArray[0];
          

          此代码的最后 3 行可以简化,但我写了更长的版本,以便我们了解每个步骤中发生的情况。

          allText 评估后的变量应该等于Accepted usernames are: standard_user locked_out_user problem_user performance_glitch_user

          一旦我们删除出现在h4 元素中的Accepted usernames are: 文本,filteredText 就等于standard_user locked_out_user problem_user performance_glitch_user,每个项目都由换行符分隔,\r\n 字符——我们使用处理这两种情况的正则表达式..

          我们将filteredText 拆分为\n 字符,因此我们得到一个数组,如下所示:

          [ "standard_user", "locked_out_user", "problem_user", "performance_glitch_user" ]
          

          然后,我们可以调用textArray[0] 来获取列表中的第一项,应该是standard_user

          【讨论】:

            【解决方案5】:

            您必须逐行读取文件并设置条件以获取具有无标签的行

            if(!line.startwith("<"){ //your code}
            

            或使用库来读取 html 文件取决于您的编程语言

            【讨论】:

              猜你喜欢
              • 2020-11-01
              • 2021-03-05
              • 1970-01-01
              • 2018-11-15
              • 2021-12-29
              • 2019-09-03
              • 2020-02-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多