Selenium Python: Как нажать на элемент с динамическим идентификатором, используя Selenium и Python - PullRequest
0 голосов
/ 01 октября 2019

У меня есть этот элемент xpath, который динамически изменяется, и мне нравится нажимать на него, как я могу это сделать?

//*[@id="/api/services/61_ellipsis"]

Кнопка HTML:

<button type="button" class="v-btn v-btn--flat v-btn--icon v-btn--round theme--light v-size--default" id="/api/services/33_ellipsis">
    <span class="v-btn__content">
        <i aria-hidden="true" class="v-icon notranslate mdi mdi-dots-vertical theme--light">
        </i>
    </span>
</button>

Ответы [ 2 ]

1 голос
/ 02 октября 2019

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

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.v-btn.v-btn--flat.v-btn--icon.v-btn--round.theme--light.v-size--default[id^='/api/services/'] > span.v-btn__content > i.v-icon.notranslate.mdi.mdi-dots-vertical.theme--light"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='v-btn v-btn--flat v-btn--icon v-btn--round theme--light v-size--default' and starts-with(@id, '/api/services/')]/span[@class='v-btn__content']/i[@class='v-icon notranslate mdi mdi-dots-vertical theme--light']"))).click()
    
  • Примечание: Вы должны добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 01 октября 2019

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

Запросить любой элемент, который содержит api/services в идентификаторе:

//*[contains(@id, 'api/services')]

Запрос на кнопку без какой-либо идентификационной информации. Имеет внутренние элементы span и i:

//button[span/i]

Запрос на элемент кнопки, содержащий api/services в идентификаторе, а также внутренние элементы span и i:

//button[span/i and contains(@id, 'api/services')]

Чтобы сохранить идентификатор, вы хотите найти элемент, а затем получить его атрибут ID:

buttonId = driver.find_element_by_xpath("//button[span/i and contains(@id, 'api/services')]").get_attribute("id")
...