Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Selenium中使用XPath选择器捕获禁用的复选框和同级的href值_C#_Xpath_Selenium - Fatal编程技术网

C# 在Selenium中使用XPath选择器捕获禁用的复选框和同级的href值

C# 在Selenium中使用XPath选择器捕获禁用的复选框和同级的href值,c#,xpath,selenium,C#,Xpath,Selenium,我将Selenium与.NET/language一起使用,它是C与IE9的结合,并具有以下html标记相关部分 <tr> <td class="a" align="b"> <span class="i"/> <input type="checkbox" class="checkboxClass" name="chkBox" value="100" disabled/>

我将Selenium与.NET/language一起使用,它是C与IE9的结合,并具有以下html标记相关部分

    <tr>
        <td class="a" align="b">
            <span class="i"/>
            <input type="checkbox" class="checkboxClass" name="chkBox" value="100" disabled/>
            </td>
        <td>
            <a href="/links/items/100.img">Battery</a>
        </td>
            <td align="left">3/16/2016
            </td>
    </tr>
    <tr>
        <td class="a" align="b">
        <span class="i"/>
        <input type="checkbox" class="checkboxClass" name="chkBox" value="101"/>
        </td>
    <td>
        <a href="/links/items/101.img">Polish</a>
    </td>
        <td align="left">3/16/2016
        </td>
</tr>
<tr>
    <td class="a" align="b">
        <span class="i"/>
        <input type="checkbox" class="checkboxClass" name="chkBox" value="101" disabled/>
        </td>
    <td>
        <a href="/links/items/102.img">Polish</a>
    </td>
        <td align="left">3/16/2014
        </td>
</tr>
我在前面的兄弟姐妹身上做了很多尝试和错误,但没有做更多。例如,我尝试硬编码href并查看是否可以访问复选框元素,以便稍后在循环中对其进行泛化并检查复选框的Selected属性。然而,下面的方法不起作用

var checkbox = driver.FindElement(By.XPath("//tr/td[a[@href='links/items/100.img']]/preceding-sibling::td[1]"));

我的直觉是,解决方案可能很简单,只需一个XPath表达式,这样我就可以避免循环,这将有助于从社区获得反馈

与其尝试按同级、父级等筛选元素,不如选择符合条件的TR元素,然后在matcheds TRs中获取A元素

符合您标准的TR元素是那些具有嵌入式禁用输入的元素:

//tr[td[1]//input[@disabled]]
然后,您希望在每个匹配的TR中获得A元素,因此需要附加/td[2]/A

获取A元素的最后一个XPath扩展是:

//tr[td[1]//input[@disabled]]/td[2]/a
由此,您可以使用与最初相同的方法检索href属性


[由OP编辑]值得一提的是,要获得实际的href属性,请使用selenium IWebElement的GetAttribute方法,并将href作为参数i-e GetAttributehref。出于某种原因,在本例中,在版本9上测试的IE selenium驱动程序在使用XPath表达式//tr[td[1]//input[@disabled]]/td[2]/a/@href时出现错误,如其中一个响应中所述。由于上述方法工作良好,解决了原始问题,因此此解决方案是完整的

谢谢塔马斯,你的回答真的很有帮助。但是,执行时的最终XPath表达式出现错误。无法计算XPath表达式“//tr[td[1]//input[@disabled]]]]/td[2]/a/@href]”,或者不会生成WebElement。因此,我将其稍微调整为//tr[td[1]//input[@disabled]]]/td[2]/a,然后使用IWebElement的getAttributeRef方法获取href属性,该方法为我提供了实际的URL。我不介意将您的响应标记为答案,但在我更新XPath之前,您可能需要更新XPath。我明白了,因此/@href与driver.FindElements的关系不太好。这很有道理。幸运的是,我已经将XPath更新为更短的XPath。如上所述,我尝试了更新的XPath表达式,现在我得到了太多匹配的元素作为回报,即使是没有禁用复选框的元素。不过我很好奇,当您从原始XPath中取出@href时,我相信您也会丧失直接获取href作为返回元素的能力,这意味着您必须使用GetAttribute方法将其作为属性获取,正如我在上一篇评论中提到的。我修改了适用于您的XPath。。。请注意,前一个也为我使用谷歌浏览器工作。我没有你的C语言,一些Selenium环境的HTML解析器/XPath引擎来确保它对你有效,但我认为你已经有了这个想法。如果您认为我的答案更完整,请随意编辑。我会更新您的原始答案,并将其标记为完整答案。谢谢你的帮助。
//tr[td[1]//input[@disabled]]/td[2]/a