2017-02-19 32 views
1

我有在它硒 - 得到兩個H1元素

<h1> ... </h1> 
<p> ... </p> 
<p> ... </p> 
<h1> ... </h1> 
<h2> ... </h2> 
<p> ... </p> 
<h3> ... </h3> 
<p> ... </p> 
<p> ... </p> 
<h1> ... </h1> 

以下HTML片段鑑於第一h1元素是//*[@id="profile"]/div[2]/div[2]/div/h1[1]的XPath的網頁,並在中的XPath之間的所有元素的列表最後h1元素是//*[@id="profile"]/div[2]/div[2]/div/h1[3],我怎樣才能得到一個引用這兩個元素之間的所有元素的列表?

+0

有沒有機會發佈一個鏈接到頁面?沒有看到頁面,我建議你尋找一個父元素,它包含你想要的所有元素(如果有的話),然後從父元素中獲取包含的元素。 – JeffC

+0

你能詳細說明你爲什麼要這麼做嗎?可能有更好的方法。 – JeffC

回答

0

深度限定的xPath與element location strategy是反模式,請考慮以下列表,從下列目標元素開始,向外看並非自上而下。全局唯一項目

  1. ID屬性
  2. 對當地獨特的項目
  3. 集中的XPath的最大控制
  4. 類名稱與框架
  5. 內容文本

最佳實踐名稱屬性使用Selenium WebDriver進行前端開發使得頁面易於自動化測試。

0

如果爲第一個和第三個h1添加一些獨特的屬性,以下xpath可以工作。

"//*[preceding-sibling::h1[@some unique att] and following-sibling::h1[@some unique att]" 
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返回來忽略你不想要的兄弟姐妹。

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#編寫的,但希望這個邏輯適合你。