Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
Ruby Selenium使用xpath查找元素_Ruby_Selenium_Selenium Webdriver_Xpath_Capybara - Fatal编程技术网

Ruby Selenium使用xpath查找元素

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() 但我只需要选中单选按钮的第一行和第二行的贷款金额 桌子{ 边

我需要找到投资者A贷款金额的元素(在本例中为100100)

有人能建议如何编写xpath来查找这些元素吗

[示例] 在下面的屏幕截图中,我需要找到xpath来获取第一行和第二行中文本为100的元素,并为其选择单选按钮


下面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