无法使用 C# 通过 XPath 查找元素
Unable to find element via XPath with C#
我正在尝试查找并单击以下元素:
<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 测试器中找到它
我不知道问题出在哪里。感谢任何帮助。
此致。
定位元素:
<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();
问题似乎出在元素文本的显示方式上:
如您所见:
<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>
感谢大家的意见。
我正在尝试查找并单击以下元素:
<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 测试器中找到它我不知道问题出在哪里。感谢任何帮助。
此致。
定位元素:
<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();
问题似乎出在元素文本的显示方式上:
如您所见:
<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>
感谢大家的意见。