Невозможно найти элемент, и нет такой ошибки элемента при использовании Selenium и Python - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу нажать кнопку Сведения о клиенте, но я получил ошибку. Это ошибка из python:

Message: no such element: Unable to locate element

Я попробовал несколько кодов (перечисленных ниже), но они не работали. Есть идеи?

1. driver.find_element_by_xpath("(//a[contains(text(),'Customer Details')])[11]").click()
2. driver.find_element_by_xpath("(//a[@href='https://mylink' and @class=' class="btn-sm bg-navy btn-default"']").click()
3. driver.find_element_by_link_text("Customer Details").click()

Это мой HTML Код:

<table class="table table-bordered table-striped dataTable no-footer DTFC_Cloned" style="width: 100%; padding: 0px; margin: 0px;" role="grid" aria-describedby="tbl_so_info">
    <thead>
        <tr role="row" style="height: 0px;">
            <th class="sorting" tabindex="0" aria-controls="tbl_so" rowspan="1" colspan="1" aria-label=": activate to sort column ascending"></th>
            <th class="sorting_desc" tabindex="0" aria-controls="tbl_so" rowspan="1" colspan="1" aria-label="Customer No.: activate to sort column ascending" aria-sort="descending"></th>
        </tr>
        </thead>
        <tbody>
        <tr role="row" class="odd" data-dt-row="0" style="height: 38px;">
            <td data-dt-row="0" data-dt-column="0">
                <a href="https://mylink" onclick="window.open('https://mylink', '_blank'); return false;" class="btn-sm bg-navy btn-default" align="center">Customer Details</a>
                <a href="https://my_second_link" onclick="window.open('https://my_second_link', '_blank'); return false;" class="btn-sm bg-navy btn-default" align="center">Create Ticket</a>
            </td>
        </tr>
    </tbody>
</table>

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

К click() на элементе, который вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • Использование LINK_TEXT:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Customer Details"))).click()
    
  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.btn-sm.bg-navy.btn-default[href='https://mylink']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='btn-sm bg-navy btn-default' and @href='https://mylink'][contains(.,'Customer Details')]"))).click()
    
  • Примечание : необходимо добавить следующий импорт:

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

Ссылка

Соответствующее подробное обсуждение можно найти в:

1 голос
/ 04 февраля 2020

Используя WebDriverWait, дождитесь нажатия на элемент, прежде чем щелкнуть по нему:

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

# ...
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Customer Details'))).click()

# css selector
# wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[href="https://mylink"]'))).click()
0 голосов
/ 04 февраля 2020

Написанный вами xpath был верным, пока вы не добавили [11]. Теперь ваш код ищет тег с информацией о клиенте. Но добавление [11] приведет к поиску 11-го результата, которого нет в вашем коде. Следовательно, он говорит, что такой элемент не найден.

Попробуйте написать только приведенный ниже код, и он будет работать нормально.

xpath = "// a [содержит (text (), 'Customer Детали ')] "

ПРИМЕЧАНИЕ: - НИКОГДА НЕ ИСПОЛЬЗОВАТЬ эти ([1] [11] [2]) вещи в ваших локаторах это не так хороший подход, как будто структура программы меняется, тогда локатор может не работать.

...