Как прокрутить веб-страницу вниз до указанной кнопки c, чтобы нажать? - PullRequest
2 голосов
/ 05 марта 2020

Я работаю с Python и Selenium, но застрял, пытаясь прокрутить страницу, пытаясь прокрутить страницу вниз, пока селен не найдет классическую c кнопку «Показать больше» (кажется, что она скрыта).

До сих пор я делал следующее:

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


from selenium.webdriver.common.keys import Keys


element = browser.find_element_by_xpath('//*[@id="ember371"]/button') # you can use ANY way to locate element
coordinates = element.location_once_scrolled_into_view # returns dict of X, Y coordinates
browser.execute_script('window.scrollTo({}, {});'.format(coordinates['x'], coordinates['y']))

Однако, что бы я ни пытался сделать Python, я получаю несколько ошибок, например, ниже.

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="ember371"]/button"}
  (Session info: chrome=80.0.3987.122)

Может ли это быть из-за того, что кнопка скрыта?

Ниже приведен код HTML для кнопки, которую я ищу, и которую я хотел бы нажать.

<button class="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" aria-expanded="false" data-control-name="skill_details" data-ember-action="" data-ember-action-2182="2182">
                    <span aria-hidden="true">
                    Show more
                  </span>
                  <span class="visually-hidden">
                    BLA BLA BLA
                  </span>
                  <li-icon aria-hidden="true" type="chevron-down-icon" class="pv-skills-section__chevron-icon" size="small"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" data-supported-dps="16x16" fill="currentColor" width="16" height="16" focusable="false">
  <path d="M8 9l5.93-4L15 6.54l-6.15 4.2a1.5 1.5 0 01-1.69 0L1 6.54 2.07 5z"></path>
</svg></li-icon>

</button>
#

Она работала со следующим:

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


# scroll down smoothly
scheight = .1
while scheight < 1.0:
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight*%s);" % scheight)
    scheight += .1
    time.sleep(1)
try:
    browser.execute_script("arguments[0].scrollIntoView(true);", WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.XPATH, "//button[@aria-controls='skill-categories-expanded' and @data-control-name='skill_details']/span[normalize-space()='Show more']"))))
    browser.execute_script("arguments[0].click();", WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-controls='skill-categories-expanded' and @data-control-name='skill_details']/span[normalize-space()='Show more']"))))
except:
    print('NO')

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Элемент Показать больше в Веб-сайт Ember JS включен элемент. Таким образом, к scrollIntoView элементу, который вам нужно вызвать WebDriverWait для element_to_be_clickable(), можно использовать одну из следующих стратегий локатора :

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

    driver.execute_script("arguments[0].scrollIntoView(true);", WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "button[aria-controls='skill-categories-expanded'][data-control-name='skill_details']>span"))))
    driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-controls='skill-categories-expanded'][data-control-name='skill_details']>span"))))
    
  • Использование XPATH:

    driver.execute_script("arguments[0].scrollIntoView(true);", WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//button[@aria-controls='skill-categories-expanded' and @data-control-name='skill_details']/span[normalize-space()='Show more']"))))
    driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-controls='skill-categories-expanded' and @data-control-name='skill_details']/span[normalize-space()='Show more']"))))
    
  • Примечание : Вы должны добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 05 марта 2020

Сначала вы можете попытаться выяснить, включена ли кнопка «Показать больше» с помощью метода isEnabled (). Этот метод возвращает значение «true», если указанный веб-элемент включен на веб-странице, в противном случае возвращает значение «false», если веб-элемент отключен на веб-странице.

Если метод isEnabled () возвращает False, вы затем можете попробовать прокрутить страницу вниз, пока элемент не станет видимым, и снова использовать метод isEnabled ().

Также попробуйте заменить id на XPath. Это может сработать.

0 голосов
/ 05 марта 2020

Вы можете попробовать здесь использовать некоторое время l oop, проверить наличие кнопки в качестве условия и поместить browser.execute_script в тело. Таким образом, вы начнете с проверки, существует ли кнопка, если нет, то прокрутите ее на 200 пикселей или около того (просто убедитесь, что вы не прокручиваете мимо кнопки), пока кнопка не появится.

...