无法使用C#通过XPath查找元素

时间:2018-04-10 12:29:27

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

我想找到并点击以下元素:

<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测试程序中找到它

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

问候。

2 个答案:

答案 0 :(得分: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();

您可以更精细地使用属性data-columna值,该值设置为 colAusenciaDia ,如下所示:

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();

答案 1 :(得分:1)

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

正如你在这里看到的那样:

<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();

这样代码会搜索<span>,其中只包含,

之前的文字

感谢大家的意见。