我有一个网页,其中包含以下HTML代码段
<h1> ... </h1>
<p> ... </p>
<p> ... </p>
<h1> ... </h1>
<h2> ... </h2>
<p> ... </p>
<h3> ... </h3>
<p> ... </p>
<p> ... </p>
<h1> ... </h1>
鉴于第一个h1元素的xpath是//*[@id="profile"]/div[2]/div[2]/div/h1[1]
,并且最后一个h1元素的xpath是//*[@id="profile"]/div[2]/div[2]/div/h1[3]
,我怎样才能获得一个列表,其中包含对这两个元素之间所有元素的引用?
答案 0 :(得分:0)
深度限定的xPath是反模式element location strategy,而是考虑以下列表,从以下目标元素开始,向外看,而不是自上而下。
前端开发的最佳实践使页面易于使用Selenium WebDriver进行自动化测试。
答案 1 :(得分:0)
如果为第一个和第三个h1添加一些唯一属性,则可以使用以下xpath。
"//*[preceding-sibling::h1[@some unique att] and following-sibling::h1[@some unique att]"
答案 2 :(得分:0)
考虑一大堆这样的HTML:
<body>
<h1 id="profile"> 1st h1 </h1>
<p> 1st p </p>
<p> 2nd p </p>
<h1> 2nd h1 </h1>
<h2> 1st h2 </h2>
<p> 3rd p </p>
<h3> 1st h3 </h3>
<p> 4th p </p>
<p> 5th p</p>
<h1 id="profile"> 3rd h1 </h1>
</body>
您想要的项目有(普通)父项,即body
元素。因此,通过找到第一个h1
,您可以找到该父项。然后,您可以找到第一个h1
的所有兄弟姐妹。
>>> from selenium import webdriver
>>> from selenium.webdriver.common.keys import Keys
>>> driver = webdriver.Chrome()
>>> driver.get('file://c:/scratch/temp.htm')
>>> parent = driver.find_element_by_xpath('//h1[@id="profile"]/..')
>>> for child in parent.find_elements_by_xpath('./child::*'):
... child.text, child.get_attribute('id')
...
('1st h1', 'profile')
('1st p', '')
('2nd p', '')
('2nd h1', '')
('1st h2', '')
('3rd p', '')
('1st h3', '')
('4th p', '')
('5th p', '')
('3rd h1', 'profile')
在此循环中child
将包含您似乎想要的参考。您可以使用get_attribute
返回的内容来忽略您不想要的兄弟姐妹。
答案 3 :(得分:0)
在C#中我会做这样的事情
static int void test(ChromeDriver driver)
{
int counter = 0;
try
{
for (int i = 1; i <= 3; i++)
{
string getdata = driver.FindElementByXPath("//*[@id=""profile""]/div[2]/div[2]/div/h1[" + i +]").Text;
counter++;
}
}
catch
{
return counter;
}
}
在循环搜索每个元素时,通过递增Xpath值+1
div[2]/div[2]/div/h1[1]
div[2]/div[2]/div/h1[2]
div[2]/div[2]/div/h1[3]
对于循环达到无法找到的值的异常,然后返回计数值。这样你就知道[3]元素存在。您可以单击“编写所需的任何内容”以单击所需的任何人。对不起它在C#中,但希望逻辑适合你。
答案 4 :(得分:0)
以下xpath
将使您进入两个值之间。
//*[preceding-sibling::h1]