【问题标题】:Unable to find element via XPath with C#使用 C# 无法通过 XPath 找到元素
【发布时间】:2018-09-20 01:51:23
【问题描述】:

我正在尝试查找并单击以下元素:


<input type="checkbox" data-columna="colAusenciaDia" data-bind="attr: { 'data-AlumnoId': $data.AlumnoId }" data-alumnoid="9f900e5a-3325-4179-9c6f-a7bc008988c0"/>

这段代码里面:


<?xml version="1.0" encoding="UTF-8"?>

<tr data-bind="attr: { Id: $data.AlumnoId }" id="9f900e5a-3325-4179-9c6f-a7bc008988c0" class=""> 
  <td class="bkgAzul text-center" style="color: #fff; width: 20px;"> 
    <span data-bind="text: $root.ObtenerContador()">1</span> 
  </td>  
  <td width="190px"> 
    <span data-bind="text: $data.Apellido1 + ' ' + $data.Apellido2 + ', ' + $data.AlumnoNombre">Ap_Alumno_0AñosA_1 , Nb_Alumno_0AñosA_1</span> 
  </td>  
  <td class="text-center" colspan="1" width="40px"> 
    <!-- ko if: ($data.DiaJustificado &&  $data.DiaJustificadoMismaPersona) || $data.IncidenciaDiaria  -->  
    <!-- /ko -->  
    <!-- ko if: $data.DiaJustificado &&  $data.DiaJustificadoMismaPersona == false && $data.IncidenciaDiaria==false  -->  
    <!-- /ko -->  
    <!-- ko if: $data.DiaJustificado == false && $data.IncidenciaDiaria == false -->  
    <input type="checkbox" data-columna="colAusenciaDia" data-bind="attr: { 'data-AlumnoId': $data.AlumnoId }" data-alumnoid="9f900e5a-3325-4179-9c6f-a7bc008988c0"/>  
    <!-- /ko --> 
  </td>  
  <!-- ko if: $root.TienePermisoJustificar() -->  
  <td class="text-center" width="40px"> 
    <!-- ko if: $data.DiaJustificado &&  $data.DiaJustificadoMismaPersona == true -->  
    <!-- /ko -->  
    <!-- ko if: $data.DiaJustificado &&  $data.DiaJustificadoMismaPersona == false -->  
    <!-- /ko -->  
    <!-- ko if: $data.DiaJustificado == false && $data.IncidenciaDiaria == false -->  
    <input type="checkbox" data-columna="colJustificadaDia" data-bind="attr: { 'data-AlumnoId': $data.AlumnoId }" disabled="disabled" data-alumnoid="9f900e5a-3325-4179-9c6f-a7bc008988c0"/>  
    <!-- /ko -->  
    <!-- ko if: $data.DiaJustificado == false && $data.IncidenciaDiaria == true -->  
    <!-- /ko --> 
  </td>  
  <!-- /ko --> 
</tr>

为此,我使用以下代码:


// where nombreAlumno is "Ap_Alumno_0AñosA_1 , Nb_Alumno_0AñosA_1"
driver.FindElement(By.XPath("//td/span[contains(text(), '" + nombreAlumno + "')]/ancestor::tr/td/input[@data-columna = 'colAusenciaDia']")).Click();

但是没有找到该元素。问题是我可以在像 http://www.xpathtester.com/xpath 这样的 XPath 测试器中找到它

我不知道问题出在哪里。任何帮助表示赞赏。

问候。

【问题讨论】:

  • 你为什么要写这么复杂的xpath?这对我有用 "//input[@data-columna = 'colAusenciaDia']"
  • 嗨,@Pradeephebbar html 代码只是大约 40 行的动态表的 sn-p。由于表格是动态的,如果没有StaleElementException,我无法以其他方式进行操作,这就是为什么我使用 nombreAlumno 变量来查找我正在寻找的行。
  • 可以添加网页的url吗?没有找到元素时的异常是什么?
  • 它在 IFRAME 中吗?您是否尝试过添加等待?

标签: c# html selenium xpath visual-studio-2015


【解决方案1】:

定位元素:

<input type="checkbox" data-columna="colAusenciaDia" data-bind="attr: { 'data-AlumnoId': $data.AlumnoId }" data-alumnoid="9f900e5a-3325-4179-9c6f-a7bc008988c0"/>

并调用click(),您可以使用以下代码行:

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,5,100));
IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//td/span[contains(., '" + nombreAlumno + "')]//following::td[2]/input"))).Click();

您可以更细化并使用设置为 colAusenciaDia 的属性data-columna 值,如下所示:

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,5,100));
IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//td/span[contains(., '" + nombreAlumno + "')]//following::td/input[@data-columna='colAusenciaDia']"))).Click();

【讨论】:

  • 嗨@DebanjanB,我已经尝试了这两种解决方案(甚至将. 更改为text() 只是为了确保它们似乎都无法解决问题。感谢您的意见。
  • @elgato 查看我更新的答案并告诉我状态。
  • 您好@DebanjanB,我尝试了您的解决方案,对其进行了一些修改:WebDriverWait wait = new WebDriverWait(SeleniumHelper.GetWebDriver(), new TimeSpan(0, 5, 100)); wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//td/span[contains(., '" + nombreAlumno + "')]//following::td[2]/input"))).Click( ); SeleniumHelper.GetWebDriver().FindElement(By.XPath("//td/span[contains(text(), '" + nombreAlumno + "')]//following::td[2]/input")).点击();但是,执行失败并显示 Managed Debugging Assistant 'ContextSwitchDeadlock',即使该元素是可见的。
  • @elgato 好吧,我看不到 SeleniumHelper 类和 GetWebDriver 方法。检查该方法是否存在死锁。否则我们的代码是完美的。
【解决方案2】:

似乎问题在于元素的文本如何显示:

如您所见:


<span data-bind="text: $data.Apellido1 + ' ' + $data.Apellido2 + ', ' + $data.AlumnoNombre">Ap_Alumno_0AñosA_1  , Nb_Alumno_0AñosA_1</span>

span 的文本在逗号前包含两个空格:Ap_Alumno_0AñosA_1 ,

但是,其中的文本将仅显示一个空格Ap_Alumno_0AñosA_1 , Nb_Alumno_0AñosA_1

knockout.js好像有问题

无论如何,我通过更改驱动程序查找元素的方式来修复它:


driver.FindElement(By.XPath("//td/span[contains(text(), '" + nombreAlumno.Substring(nombreAlumno.IndexOf(",")) + "')]/ancestor::tr/td/input[@data-columna = 'colAusenciaDia']")).Click();

这样代码将搜索&lt;span&gt;,它只包含文本,直到,

感谢大家的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2022-07-05
    • 2011-08-14
    • 2019-05-06
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多