Ruby Selenium使用xpath查找元素
我需要找到投资者A贷款金额的元素(在本例中为100100) 有人能建议如何编写xpath来查找这些元素吗 [示例] 在下面的屏幕截图中,我需要找到xpath来获取第一行和第二行中文本为100的元素,并为其选择单选按钮Ruby Selenium使用xpath查找元素,ruby,selenium,selenium-webdriver,xpath,capybara,Ruby,Selenium,Selenium Webdriver,Xpath,Capybara,我需要找到投资者A贷款金额的元素(在本例中为100100) 有人能建议如何编写xpath来查找这些元素吗 [示例] 在下面的屏幕截图中,我需要找到xpath来获取第一行和第二行中文本为100的元素,并为其选择单选按钮 下面xpath给出了所有三个贷款金额 //td[contains(., "Investor A")]/preceding-sibling::td[descendant::input][1]/label/text() 但我只需要选中单选按钮的第一行和第二行的贷款金额 桌子{ 边
下面xpath给出了所有三个贷款金额
//td[contains(., "Investor A")]/preceding-sibling::td[descendant::input][1]/label/text()
但我只需要选中单选按钮的第一行和第二行的贷款金额
桌子{
边框:1px虚线#中交;
边界塌陷:塌陷;
}
表td{
边框:1px虚线#中交;
}
贷款1
100
投资者A
200
投资者B
300
投资者C
贷款2
100
投资者A
200
投资者B
300
投资者C
贷款3
100
投资者A
200
投资者B
300
投资者C
此处示例如何获取单选按钮取决于贷款标签和价值:
//tr[.//label[.='Loan1']]//td[./label[.='100']]/input
//tr[.//label[.='Loan1']]//td[./label[.='300']]/input
//tr[.//label[.='Loan2']]//td[./label[.='100']]/input
//tr[.//label[.='Loan3']]//td[./label[.='200']]/input
下面的示例说明如何获取单选按钮取决于贷款标签和价值:
//tr[.//label[.='Loan1']]//td[./label[.='100']]/input
//tr[.//label[.='Loan1']]//td[./label[.='300']]/input
//tr[.//label[.='Loan2']]//td[./label[.='100']]/input
//tr[.//label[.='Loan3']]//td[./label[.='200']]/input
请尝试以下xpath:
//td[包含(,“投资者A”)]/前面的兄弟姐妹::td[后代::输入[@selected或@checked]][1]/label/text()
尝试以下xpath:
//td[contains(,“Investor A”)]/previous sibling::td[genderant::input[@selected或@checked][1]/label/text()
由于您是在贷款标签(Loan1)和投资者(Investor A)下查找贷款金额,因此可以使用下面的XPath
//tr[.//label[.='Loan1']]//label[.='Investor A']//preceding::label[1]
^ find a TR
^ that has a descendant LABEL with the loan label
^ that TR has a descendant LABEL that contains the investor name
^ then go back up the DOM and find the first LABEL
这将返回“100”
您可以在XPath中插入您想要的任何贷款和投资者标签,并获得您想要的任何贷款金额
"//tr[.//label[.='#{loanLabel}']]//label[.='#{investorLabel}']//preceding::label[1]"
请参见因为您正在查找贷款标签(Loan1)和投资者(投资者A)下的贷款金额,所以可以使用下面的XPath
//tr[.//label[.='Loan1']]//label[.='Investor A']//preceding::label[1]
^ find a TR
^ that has a descendant LABEL with the loan label
^ that TR has a descendant LABEL that contains the investor name
^ then go back up the DOM and find the first LABEL
这将返回“100”
您可以在XPath中插入您想要的任何贷款和投资者标签,并获得您想要的任何贷款金额
"//tr[.//label[.='#{loanLabel}']]//label[.='#{investorLabel}']//preceding::label[1]"
请参见如果单选按钮的选择状态在加载HTML后发生了更改,则XPath无法执行您尝试执行的操作。这是因为XPath不能访问反映当前状态的输入属性(它只能访问属性)。您还存在一个问题,即没有任何元素实际与它们所引用的任何输入相关联(如果您是创建此HTML的人,您应该真正解决这个问题)。CSS确实可以访问页面的当前状态,并且您感兴趣的所有收音机似乎都有以
\u one
结尾的ID,因此我们可以使用它来查找相关元素。CSS将是
输入[id$=“\U one”]:选中+标签
因为您需要CSS将找到的标签元素的文本,并且您指示您正在使用Capybara,所以它将是
texts = all(:css, 'input[id$="_one"]:checked + label').map(&:text)
注意:这实际上并没有使用文本“Investor A”来查找您感兴趣的元素。如果ID不可靠,并且使用“Investor A”文本很重要,则无法使用单一XPath或CSS以HTML的结构方式进行此操作。如果单选按钮的选择状态在加载HTML后已更改,则XPath无法执行您尝试执行的操作。这是因为XPath不能访问反映当前状态的输入属性(它只能访问属性)。您还存在一个问题,即没有任何元素实际与它们所引用的任何输入相关联(如果您是创建此HTML的人,您应该真正解决这个问题)。CSS确实可以访问页面的当前状态,并且您感兴趣的所有收音机似乎都有以
\u one
结尾的ID,因此我们可以使用它来查找相关元素。CSS将是
输入[id$=“\U one”]:选中+标签
因为您需要CSS将找到的标签元素的文本,并且您指示您正在使用Capybara,所以它将是
texts = all(:css, 'input[id$="_one"]:checked + label').map(&:text)
注意:这实际上并没有使用文本“Investor A”来查找您感兴趣的元素。如果ID不可靠,并且使用“Investor A”文本很重要,那么就不可能使用单一XPath或CSS以HTML的结构方式来实现这一点。您想找到什么?单选按钮?@GregBurghardt,我已经用例子更新了这个问题。如果您需要更多信息,请告诉我您到目前为止尝试获取元素的代码是什么?下面xpath给出了所有三个贷款金额//td[contains(,“Investor A”)]/previous sibling::td[genderant::input][1]/label/text()但我只需要选择单选按钮的第一行和第二行的贷款金额。请将此添加到您的问题中,而不是添加注释。您想查找什么?单选按钮?@GregBurghardt,我已经用例子更新了这个问题。如果您需要更多信息,请告诉我您到目前为止尝试获取元素的代码是什么?下面xpath给出了所有三个贷款金额//td[contains(,“Investor A”)]/previous sibling::td[genderant::input][1]/label/text()但我只需要选择单选按钮的第一行和第二行的贷款金额。请将此添加到您的问题中,而不是添加注释。感谢您提供xpath。由于某种原因,如果我有[@selected],则未选择元素。下面xpath给出了所有三个贷款金额//td[包含(,“投资者A”)]/前面的兄弟姐妹::td[后代::输入][1]/label/text()是否有其他方法获取所选输入?我有upd