Нажмите «Показать больше предложений» на веб-странице Selenium. - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы нажать на каждое «Показать еще 10 сделок» на следующей странице: «https://www.uswitch.com/broadband/compare/deals_and_offers/", но, похоже, оно не работает. Я застрял с следующей ошибкой:

 AttributeError: 'NoneType' object has no attribute 'find_element'

Мой код следующий:

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

url = "https://www.uswitch.com/broadband/compare/deals_and_offers/"

driver = webdriver.Chrome(r'C:\temp\chromedriver.exe')

browser = driver.get(url)
while True:
    button = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, 'Show 10 more deals')))
button.click()

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Чтобы щелкнуть по элементу с текстом Показать еще 10 предложений на странице https://www.uswitch.com/broadband/compare/deals_and_offers/, вы можете использовать следующее решение:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    url = "https://www.uswitch.com/broadband/compare/deals_and_offers/"
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    browser = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    browser.get(url)
    while True:
        try:
            browser.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(browser,20).until(EC.visibility_of_element_located((By.XPATH, "//button[@class='us-btn us-btn--action' and contains(.,'Show 10 more deals')]"))))
            browser.execute_script("arguments[0].click();", WebDriverWait(browser,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.us-btn.us-btn--action[name='visible_products']"))))
            print("Button clicked")
        except:
            print("No more Buttons")
            break
    browser.quit()
    
  • Выход на консоль:

    Button clicked
    Button clicked
    Button clicked
    Button clicked
    Button clicked
    Button clicked
    Button clicked
    Button clicked
    Button clicked
    Button clicked
    No more Buttons
    
0 голосов
/ 21 ноября 2018

Попробуйте так:

while not re.search(r"Showing (\d+) of \1 ", browser.page_source):
  browser.execute_script("document.querySelector('[data-event-label=\"Show 10 more products\"]').click()")
  time.sleep(1)

Это позволяет избежать ошибок селена, которые в конечном итоге приведут вас в бешенство.

0 голосов
/ 20 ноября 2018

Попробуйте следующее, в котором для выбора атрибута data-event-action кнопки по ее значению используется селектор атрибута = значение CSS

driver.find_element_by_css_selector('[data-event-action="Show 10 more products"]').click()

Замените driver на browser, если требуется.

...