Selenium - 获取两个h1元素之间所有元素的列表

时间:2017-02-19 22:08:48

标签: python python-3.x selenium selenium-webdriver web-scraping

我有一个网页,其中包含以下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],我怎样才能获得一个列表,其中包含对这两个元素之间所有元素的引用?

5 个答案:

答案 0 :(得分:0)

深度限定的xPath是反模式element location strategy,而是考虑以下列表,从以下目标元素开始,向外看,而不是自上而下。

  1. 全球唯一商品的ID属性
  2. 本地唯一商品的名称属性
  3. 专注于xPath以实现最大程度的控制
  4. 带框架的班级名称
  5. 内容文字
  6. 前端开发的最佳实践使页面易于使用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]