Как решить эту проблему, когда я получаю сообщение об ошибке «невозможно найти элемент» при попытке нажать кнопку, которая открывается при нажатии - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь нажать на кнопку, которая увеличивается при нажатии, но селен не может найти элемент. Идентифицированный элемент кажется правильным. Я использую объектную модель страницы здесь.

Я попытался сначала просто найти элемент и щелкнуть по нему, а затем также попытался использовать ActionChains. Попытался изменить значение элемента и методы идентификации, такие как ID, XPath, CSS Selector, но, похоже, ничего не работает.

HTML:

<tr style="border-top:1px solid #e6e6e6;"><td style="display:inline-block;"><div class="expand"><i id="expand_2971740_2086074" class="fa fa-plus-circle" onclick="" style="display: block;"></i><i style="display: none;" id="collapse_2971740_2086074" class="fa fa-minus-circle" onclick="closeBundleCourses(2971740,2086074)"></i></div></td><td class="text-center">Course1Jan</td><td class="text-center">19-06-2019</td><td class="text-center">0</td><td class="text-center">1</td></tr>

Кодовые испытания:

click_plus_button = 'expand_2971740_2086074' #id

def __init__(self,driver):
        self.driver = driver

    def enroll_user(self,firstname,lastname,email):
        self.driver.find_element_by_link_text(self.go_to_manage_users).click()
        self.driver.find_element_by_class_name(self.expand_manage_users).click()
        time.sleep(2)
        actions = ActionChains(self.driver)
        actions.move_to_element(self.driver.find_element_by_id(self.click_plus_button)).click().perform()
        self.driver.find_element_by_id(self.manage_users_firstname).send_keys(manage_users_firstname)
        self.driver.find_element_by_id(self.manage_users_lastname).send_keys(manage_users_lastname)
        self.driver.find_element_by_id(self.manage_users_email).send_keys(manage_users_email)

Ожидаемый результат:

Ожидаемый результат

Фактический результат:

Фактический результат

1 Ответ

1 голос
/ 19 июня 2019

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

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.expand i.fa.fa-plus-circle[id^='expand_']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='expand']//i[@class='fa fa-plus-circle' and starts-with(@id, 'expand_')]"))).click()
    
  • Примечание : Вы должны добавить следующий импорт:

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