Невозможно нажать на элемент, даже после того, как он найден - Python Селен - PullRequest
1 голос
/ 28 апреля 2020

Мне больно какое-то время загрузить кнопку «больше». Я ищу создать al oop, где я нажимаю «загрузить больше» в разделе навыков на страницах Linkedin. Тем не менее, эта кнопка просто не постоянно нажимается.

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

Я испробовал почти каждую версию расположения элемента (xpath, имя класса, css селектор, полный xpath). Почему бы не нажать кнопку, если она видна на странице?

Соответствующий код:

##log into Linkedin

linkedin_urls=['https://www.linkedin.com/in/julie-migliacci-revent/']

ChromeOptions = webdriver.ChromeOptions()
driver = webdriver.Chrome('C:\\Users\\Root\\Downloads\\chromedriver.exe')

driver.get('https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin')
driver.maximize_window()

WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.NAME, "session_key"))).send_keys("EMAIL")
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.NAME, "session_password"))).send_keys("PASSWORD")
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@class='btn__primary--large from__button--floating']"))).click()


linkedin_urls=['https://www.linkedin.com/in/julie-migliacci-revent/', 'https://www.linkedin.com/in/kathleen-meyers-126a7931']


for linkedin_url in linkedin_urls:
   driver.get(linkedin_url)

   looking_for_element = True
   ldmore = ''

   while looking_for_element:
       elements = driver.find_elements_by_xpath('/html/body/div[7]/div[3]/div/div/div/div/div[2]/main/div[2]/div[6]/div/section/div[2]/button/span[1]')

       if len(elements) > 0:
          ldmore = elements[0]
          ldmore.click()
          looking_for_element = False
       else:
           global_copyright = driver.find_elements_by_css_selector('#globalfooter-copyright')

           if len(global_copyright) > 0:
               looking_for_element = False
           else:
               body = driver.find_element_by_css_selector('body')
               sleep(5)
               body.send_keys(Keys.PAGE_DOWN)

Я не видел обсуждения SO о проблемах элементов при базовом решении это не видимость Код предназначен для остановки, когда элемент находится - и выполняет это правильно. Но он просто не нажимает на элемент. Я не уверен, почему это так.

Места, которые я пробовал:

absolute xpath:
driver.find_element_by_xpath('/html/body/div[7]/div[3]/div/div/div/div/div[2]/main/div[2]/div[6]/div/section/div[2]/button/span[1]').click()

relative xpath: 
//span[contains(text(),'Show more')]

class name: 
pv-profile-section__card-action-bar pv-skills-section__additional-skills artdeco-container-card-action-bar artdeco-button artdeco-button--tertiary artdeco-button--3 artdeco-button--fluid" aria-controls="skill-categories-expanded

css: 
body.render-mode-BIGPIPE.nav-v2.theme.theme--classic.ember-application.boot-complete.icons-loaded:nth-child(2) div.application-outlet:nth-child(77) div.authentication-outlet:nth-child(3) div.extended div.body div.pv-profile-wrapper.pv-profile-wrapper--below-nav div.self-focused.ember-view div.pv-content.profile-view-grid.neptune-grid.two-column.ghost-animate-in main.core-rail div.profile-detail div.pv-deferred-area.ember-view:nth-child(6) div.pv-deferred-area__content section.pv-profile-section.pv-skill-categories-section.artdeco-container-card.ember-view div.ember-view > button.pv-profile-section__card-action-bar.pv-skills-section__additional-skills.artdeco-container-card-action-bar.artdeco-button.artdeco-button--tertiary.artdeco-button--3.artdeco-button--fluid

ОБНОВЛЕНИЕ: Попробовал силу JS, она нажала! Но выкинул ошибку: selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'click' of null

if len(elements) > 0:
    ldmore = elements[0]
    ldmorebtn = driver.find_element_by_xpath('/html/body/div[7]/div[3]/div/div/div/div/div[2]/main/div[2]/div[6]/div/section/div[2]/button/span[1]').click()
    #driver.execute_script("arguments[0].checked = true;", ldmore)
    driver.execute_script("arguments[0].click();", ldmore)

1 Ответ

1 голос
/ 06 мая 2020

Предложение @Datanovice использовать javascript для принудительного клика сработало как заклинание. Первоначально, когда я пытался адаптировать решение, я получил ошибку selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'click' of null.

Эта ошибка была из-за того, что я использовал EC.element_to_be_clickable. Вместо этого, когда я связал метод java с EC.visibility_of_element_located, щелчок последовательно работал.

Код:

ldmore = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH,'xpath')))
driver.execute_script("arguments[0].click();", ldmore) 
...