具有相同ID的Xpath-如何获取第二个元素?

时间:2019-04-24 17:55:49

标签: python selenium selenium-webdriver xpath webdriverwait

我遇到了从页面获取值的问题,在我操作的框架中,有3个具有相同ID的xpath,我无法使用更精确的xpath-或不知道该怎么做。

我已经尝试在xpath之后添加[0]或[1],但无法解决:

Temp_Pass = WebDriverWait(driver,9000).until(EC.presence_of_element_located((By.XPATH, "//td[@id='content-main-rowOdd']")[0])).text

Temp_Pass = WebDriverWait(driver, 9000).until(EC.presence_of_element_located((By.XPATH, "//td[@id='content-main-rowOdd']/following-sibling::tr[1]"))).text

但两种方法均无效

以下是网站上框架中的代码:

  <tbody>
      <tr>
        <td id="content-main-rowOdd">For user zxc the fallowing pass     has been generated:</td>
      </tr>
      <tr>
      <td id="content-main-rowOdd">
       abcd
         <div></div>
      </td>
      </tr>
      <tr>
      <td id="content-main-rowOdd">
         <input id="content-main-button-default" type="submit" onlick="window.close()" name="command-cancel" value="cancel">
         <input id="content-main-button-default" type="submit" name="command-next" value="Next">
      </td>
      </tr>
      .....
      </tbody>

我想得到的是“ abcd” 但是我只能抓住:“对于用户zxc,已生成以下过程:”

3 个答案:

答案 0 :(得分:2)

  1. 由于<td>元素位于单独的<tr>元素中,因此如果期望的元素位于第二个<tr>元素中,则可以尝试以下操作:"//table/tr[2]/td[@id='content-main-rowOdd']" < br /> 在代码中:

    Temp_Pass = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//table/tr[2]/td[@id='content-main-rowOdd']"))).text
    
  2. 使用find_elements_by_获取所有元素,然后从第二个元素获取文本。

    list = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.XPATH,"//td[@id='content-main-rowOdd']")));
    Temp_Pass = list[1].text
    

答案 1 :(得分:0)

这里是您获取第二个元素所需的XPath。您可以在XPath选择器上使用[2],但使用起来有点奇怪。

Temp_Pass = WebDriverWait(driver,9000).until(EC.presence_of_element_located((By.XPATH, "(//td[@id='content-main-rowOdd'])[2]"))).text

请注意,XPath包含方括号,然后选择从该XPath返回的第二项。

答案 2 :(得分:0)

您快到了。由于文本 abcd 与文本关联,对于用户zxc,已经生成了休闲通行证:,提取文本 abcd 的简单方法将是将标识文本的节点标识为对于用户... ,然后标识诱导{em> WebDriverWait 的visibility_of_element_located()所需的节点,然后按如下所示提取所需的文本:

print(WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[@id='content-main-rowOdd' and contains(., 'generated')]//following::tr[1]/td[@id='content-main-rowOdd']"))).get_attribute("innerHTML"))

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC