Xpath с тем же идентификатором - как я могу получить 2-й элемент? - PullRequest
0 голосов
/ 24 апреля 2019

У меня проблема с получением значения со страницы, в фрейме, который я использую, есть 3 xpath с одинаковым идентификатором, и я не могу использовать более точный - или не знаю, как это сделать.

Я уже пытался добавить [0] или [1] после xpath, но это не сработало так:

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 ]

2 голосов
/ 24 апреля 2019
  1. Поскольку элементы <td> находятся в отдельных элементах <tr>, если ожидаемый элемент находится внутри второго элемента <tr>, вы можете попробовать это: "//table/tr[2]/td[@id='content-main-rowOdd']"
    В коде:

    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
    
0 голосов
/ 24 апреля 2019

Вы были почти там. Поскольку текст abcd связан с текстом Для пользователя zxc сгенерирован следующий проход: , простой способ извлечения текста abcd заключается в идентификации узел с текстом как для пользователя ... , а затем идентифицирует нужный узел, вызывая 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
0 голосов
/ 24 апреля 2019

Вот XPath, который вам нужен для получения 2-го элемента. Вы можете использовать [2] в селекторе XPath, но это немного странно в использовании.

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

Обратите внимание, что XPath содержит скобки, а затем мы выбираем второй элемент, возвращенный из этого XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...