Невозможно найти элемент - кажется, что несколько элементов имеют одинаковую и минимальную информацию, и я не могу найти ни того, ни другого - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь извлечь некоторые атрибуты из элемента на веб-сайте, но получаю сообщение Не удается найти ошибку элемента. Элемент не содержит много информации для поиска, кроме атрибутов, и тот, который я хочу, будет меняться каждый раз.

Сначала я конвертировал HTML в текст, а затем проводил поиск по тексту, чтобы получить то, что я хочу. Теперь я пытаюсь сделать это немного более элегантным.

Я пробовал: browser.find_element_by_name("Status")

  • для поиска атрибута текста (я знаю, что это неправильно) browser.find_element_by_xpath("//label[@class='copySource']")

  • и куча других вариаций browser.find_element_by_xpath("//element[@attribute='Device Status:']")

плюс некоторые другие вещи.

с помощью этого, с find all elements, вернул пустой список без ошибки. browser.find_elements_by_xpath("//span[@class='class']")

Код, который я пытаюсь найти:

<td>
    <label class="copySource">Device Registration Status:</label>
</td>
<tr>
    <td>
        <label class="copySource">Device Status:</label>
    </td>
    <td>
        <span class="copySource copyEndLine">operational</span>
    </td>
</tr>

Я пытаюсь извлечь атрибут в последнем элементе, слово «оперативный» (это слово меняется). Получение ошибки (или что-то похожее):

NoSuchElementException: no such element: Unable to locate element: 
{"method":"xpath","selector":"//element[@attribute='Device Status:']"}

Ответы [ 5 ]

0 голосов
/ 19 июня 2019

Вы можете попробовать это:

browser.find_elements_by_cssselector(".copySource.copyEndLine")

Если элемент находится внутри фрейма, вы должны переключиться на фрейм, вы можете использовать это:

driver.switchTo().frame("FrameName");
0 голосов
/ 19 июня 2019

Соответствующее выражение XPath будет выглядеть примерно так:

//label[text()='Device Status:']/ancestor::tr/descendant::*[contains(@class,'EndLine')]

где:

Демо-версия:

enter image description here

0 голосов
/ 19 июня 2019

Чтобы извлечь текст , действующий , вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любую из следующих стратегий локатора :

  • cssSelector:

    print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "tr td>span.copySource copyEndLine"))).get_attribute("innerHTML"))
    
  • xpath

    print(WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//label[@class='copySource' and text()='Device Status:']//following::td[1]/span[@class='copySource copyEndLine']"))).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 голосов
/ 19 июня 2019

Обычно это происходит, когда есть компоненты с похожими именами / тегами.

Можете ли вы попробовать: browser.find_elements_by_xpath("//span[@class='class']")[0] или любой другой индекс;на основе количества похожих компонентов на странице.

Также, если бы вы могли поделиться URL страницы, которую вы пытаетесь, было бы полезно.

0 голосов
/ 19 июня 2019

Попробуйте с

browser.find_element_by_css_selector(".copyEndLine").text

Вы можете попытаться добавить условие ожидания перед получением текста элемента, что-то вроде «ждать элемента», потому что, возможно, он еще не загружен, когда вы взаимодействуете с ним.

...