【问题标题】:The find element returns empty string..using XPath contains,Text()查找元素返回空字符串..使用 XPath contains,Text()
【发布时间】:2019-01-08 05:30:34
【问题描述】:

断言失败,因为 Gender 和 date 返回 false。IwebElement 返回一个元素,但是当我在其中打印文本时。结果是一个空字符串。这只发生在 Gender 和 Date rest 都给出正确结果的情况下。

代码

 IWebElement actualname = BrowserHelper.WebDriver.FindElement(By.XPath("//a[contains(text(),'"+ name+"')]"));
            Console.Write(actualname.Text);
            IWebElement actualIdentifier = BrowserHelper.WebDriver.FindElement(By.XPath("//td[contains(text(),'"+ Identifier+"')]"));
            Console.Write(actualIdentifier.Text);
            IWebElement actualGender = BrowserHelper.WebDriver.FindElement(By.XPath("//td[contains(text(),'"+ Gender+"')]"));
             Console.Write(actualGender.Text);
            IWebElement actualDateofBirth = BrowserHelper.WebDriver.FindElement(By.XPath("//td[contains(text(),'"+ DateofBirth+"')]"));
            Console.Write(actualDateofBirth.Text);
            IWebElement actualAddress = BrowserHelper.WebDriver.FindElement(By.XPath("//td[contains(text(),'"+ Address+"')]"));
            Console.Write(actualAddress.Text);

            Assert.IsTrue((actualname.Displayed) && (actualIdentifier.Displayed) && (actualGender.Displayed) && (actualDateofBirth.Displayed) && (actualAddress.Displayed), "Incorrect out put displayed for patient query");

HTML:-

<tbody _ngcontent-c32="" style="max-height: 20vh;">
            <!----><tr _ngcontent-c32="">
              <td _ngcontent-c32="" style="text-align:center;vertical-align:middle;width:5em">
                <input _ngcontent-c32="" type="checkbox" id="0_checkbox">
              </td>
              <td _ngcontent-c32="" style="vertical-align:middle">
                <!----><span _ngcontent-c32="" class="fa fa-plus"></span>
                <a _ngcontent-c32="" href="javascript:void(0)">Braden Dunthorn</a>
              </td>
              <td _ngcontent-c32="" style="vertical-align:middle">Tribal ID: 49963093</td>
              <td _ngcontent-c32="" style="vertical-align:middle">M</td>
              <td _ngcontent-c32="" style="vertical-align:middle">12/21/1990</td>
              <td _ngcontent-c32="" style="vertical-align:middle">7 Carioca , Grenville, MD, 29605</td>
              <!---->
            </tr><tr _ngcontent-c32="">
              <td _ngcontent-c32="" style="text-align:center;vertical-align:middle;width:5em">

【问题讨论】:

    标签: c# html selenium selenium-webdriver xpath


    【解决方案1】:

    这是您要求按文本搜索吗?

    因为这里您正在搜索包含文本“M”的元素

    //td[contains(text(),'"+ Gender+"')]"
    

    这将返回两个元素,因为它们都包含文本“M”

    <td _ngcontent-c32="" style="vertical-align:middle">M</td>
    <td _ngcontent-c32="" style="vertical-align:middle">7 Carioca , Grenville, MD, 29605</td>
    

    我建议您更改使用其他定位器的方法(我想 xpath 轴可以提供帮助)。如果你知道一个元素可以说性别的 id 和位置,dob 是静态的,那么 xpath 轴是最好的方法。

    【讨论】:

    • 正在创建的表是动态的并且没有 ID。搜索 M 应该返回显示,因为它试图捕捉第一次出现。但是,即使您的逻辑是正确的,但是为什么日期会发生同样的事情呢?巧合的是,这两个元素在 DB 中具有不同的数据类型。性别=char 和日期=日期时间。
    【解决方案2】:

    对于 GenderDateofBirth 不匹配的 XPath,您可以使用以下解决方案:

    • 性别

      IWebElement actualGender = BrowserHelper.WebDriver.FindElement(By.XPath("//td[normalize-space()='" + Gender + "']"));
      
    • 出生日期

      IWebElement actualDateofBirth = BrowserHelper.WebDriver.FindElement(By.XPath("//td[normalize-space()='" + DateofBirth + "']"));
      

    【讨论】:

      【解决方案3】:

      盲目猜测,但从我自己的经验来看,这两个字段加载可能是有原因的(例如,延迟加载?)。考虑设置 1 秒的等待时间(我知道,等待时间相当长,但你可以在发现它是否有效后将其降低)。

      扩展评论,我会尝试这样的事情(伪代码):

      new Thread(()=>{
          Thread.Sleep(1000);
          IWebElement actualGender = BrowserHelper.WebDriver.FindElement(By.XPath("//td[contains(text(),'"+ Gender+"')]"));
          Console.Write(actualGender.Text);
          //put a breakpoint here to look at the value received
      }).Start();
      

      最后一次尝试:尝试获取所有 td 元素 BrowserHelper.WebDriver.FindElements(By.XPath("//td"))。此列表中有性别元素吗?

      【讨论】:

      • 我怀疑 Thread.Sleep 会有什么不同,因为它会停止主线程。您可以尝试使用 Thread.Sleep 从另一个线程访问这些数据吗?
      • 我不明白。你能解释一下吗?如何从另一个线程访问?
      • 更新了答案
      【解决方案4】:

      您可以尝试获取innerText属性来获取所需的文本,如下所示:

      IWebElement actualDateofBirth = BrowserHelper.WebDriver.FindElement(By.XPath("//td[contains(text(),'"+ DateofBirth+"')]"));
      Console.Write(actualDateofBirth.GetAttribute("innerText"));
      

      告诉我,它是否适合你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 2017-09-11
        • 2021-03-21
        • 2021-06-23
        • 1970-01-01
        • 2010-12-16
        相关资源
        最近更新 更多