селен питон, попытка нажать кнопку - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь нажать кнопку «загрузить еще» со следующим кодом

browser.find_element_by_xpath('//*[@id="mainContent"]/div[1]/div/div[5]/div/div[1]').click()
browser.find_element_by_css_selector('#mainContent > div.left-panel > div > div.result-list > div > div.content').click()
browser.find_element_by_link_text('Load More').click()

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\David\eclipse-workspace\Web_Scrap\setup.py", line 38, in <module>
    browser.find_element_by_css_selector('#mainContent > div.left-panel > div > div.result-list > div > div.content').click()
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Element is not clickable at point (239, 698)
  (Session info: chrome=68.0.3440.106)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)

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

При нажатии проверьте, что следующий элемент я получаю

Код элемента следующий:

<div class="content" onclick="javascript:mtvn.btg.Controller.sendLinkEvent({ linkName:'PROFMIDPANE:LoadMore', linkType:'o' } );">Load More</div>

если у кого-нибудь есть какие-либо рекомендации о том, как мне этого добиться, я был бы очень признателен!

UPDATE: Я попробовал два рекомендованных мне решения, но, к сожалению, не сработало, я опубликую его здесь, если кому-то будет интересно.

iamsankalp89 решение:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='content' and text()='Load More']")))
element.click()

Сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\David\eclipse-workspace\Web_Scrap\setup.py", line 39, in <module>
    element.click()
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Element is not clickable at point (239, 698)
  (Session info: chrome=68.0.3440.106)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)

Решение Джулиана Морено:

ActionChains(driver).move_to_element("//div[@class='content' and text()='Load More']").click("//div[@class='content' and text()='Load More']").perform()

Сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\David\eclipse-workspace\Web_Scrap\setup.py", line 42, in <module>
    ActionChains(browser).move_to_element("//div[@class='content' and text()='Load More").click("//div[@class='content' and text()='Load More").perform()
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\action_chains.py", line 83, in perform
    action()
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\action_chains.py", line 293, in <lambda>
    Command.MOVE_TO, {'element': to_element.id}))
AttributeError: 'str' object has no attribute 'id'

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Попробуйте использовать ActionChains:

класс selenium.webdriver.common.action_chains.ActionChains (драйвер)

ActionChains(driver).move_to_element(your_element).click(your_element).perform()

Перемещение к элементу переместит мышь (курсор) в середину элемента (your_element), затем функция выполнения выполнит связанные действия.

EDIT

Попробуйте это:

load_more = browser.find_element_by_css_selector("#mainContent > div.left-panel > div > div.result-list > div > div.content")
WebDriverWait(browser, timeout).until(EC.visibility_of(load_more))
browser.execute_script("return arguments[0].scrollIntoView(true);", load_more)
ActionChains(browser).move_to_element(load_more).click().perform()

ActionChains(browser).move_to_element() принимает объект WebElement или строку, которая является идентификатором элемента. Поскольку загрузка больше не имеет идентификатора, move_to_element() не смог найти WebElement.

После анализа веб-страницы я заметил, что move_to_element(load_more) перемещается к кнопке load_more (только до тех пор, пока она не находится на экране), но также вызывает прокрутку вниз и отображает нижний колонтитул веб-страницы. Этот нижний колонтитул покрывает кнопку load_more. Следовательно, вам нужен browser.execute_script("return arguments[0].scrollIntoView(true);", load_more), который будет продолжать прокручиваться до тех пор, пока не будет виден load_more (независимо от того, отображается ли нижний колонтитул).

0 голосов
/ 04 сентября 2018

Попробуйте этот xpath

//div[@class='content' and text()='Load More']

Код такой:

browser.find_element_by_xpath('//div[@class='content' and text()='Load More']').click()

Также используйте WebDriverWait

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='content' and text()='Load More']")))
element.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...