【问题标题】:Click on "show more" button on nytimes.com with selenium使用 selenium 在 nytimes.com 上单击“显示更多”按钮
【发布时间】:2016-09-17 10:08:30
【问题描述】:

我正在尝试滚动浏览this 页面。 向下滚动到页面底部后,我需要单击“显示更多”按钮,但我无法使用 selenium 找到它。

self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
self.driver.find_element_by_class_name('button load-more-button').click()

但我收到了InvalidSelectorException

【问题讨论】:

    标签: python css selenium selenium-webdriver web-scraping


    【解决方案1】:

    你可以使用find_element_by_css_selector

    .find_element_by_css_selector("button.button.load-more-button").click()
    

    当你有多个 css 类时,你不能使用find_element_by_class_name

    代码如下所示:

    In [22]: from selenium import webdriver
    
    
    In [23]: dr = webdriver.PhantomJS()
    
    In [24]: dr.get("http://www.nytimes.com/column/corner-office")
    
    In [25]: btn = dr.find_element_by_css_selector("button.button.load-more-button") 
    
    In [26]: btn
    Out[26]: <selenium.webdriver.remote.webelement.WebElement at 0x7f50c34d7668>
    
    In [27]: btn.click()
    

    使用 Firefox,设置 .maximize_window() 也可以正常工作:

    from selenium import webdriver
    
    
    dr = webdriver.Firefox()
    dr.maximize_window()
    dr.get("http://www.nytimes.com/column/corner-office")
    
    btn = dr.find_element_by_css_selector("button.load-more-button")
    btn.click()
    

    在 Firefox 和 Chtorm 上,单击 load more 后,您必须滚动以获取其余部分,初始单击后按钮不存在:

    dr = webdriver.Firefox()
    dr.maximize_window()
    dr.get("http://www.nytimes.com/column/corner-office")
    
    btn = dr.find_element_by_css_selector("button.load-more-button")
    btn.click()
    print( len(dr.find_elements_by_xpath("//h2[@class='headline']")))
    dr.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    print( len(dr.find_elements_by_xpath("//h2[@class='headline']")))
    

    这给了你:

    44
    66
    

    【讨论】:

    • 谢谢,我把它放在一个半无限滚动的 for 循环中,但在第一次迭代后我得到Element is not clickable at point (x,y ). Other element would receive the click: &lt;div class="container"&gt;&lt;/div&gt;'。我还添加了 time.sleep(3) 以使元素出现,但它仍然无法点击
    • @Fotis,您使用的是哪个网络驱动程序?
    【解决方案2】:

    ActionChains 类可用于出现“其他元素将收到点击”等异常情况。

    试试下面的代码,应该可以的。

    elem = self.driver.find_element_by_css_selector("button.button.load-more-button")
    
    self.driver.ActionChains(driver).move_to_element(elem).click(elem).perform()
    

    【讨论】:

      【解决方案3】:

      使用下面的代码:

      elem = self.driver.find_element_by_css_selector(".button.load-more-button[aria-controls$='set-latest']");
      
      
      //this line will scroll down to make element visible
      self.driver.execute_script("window.scrollTo(" + elem.getLocation().x + "," +(elem.getLocation().y- 100) + ");");
      
      elem.click();
      

      【讨论】:

      • 如果您必须不断点击“显示更多”才能继续加载越来越多的内容,该怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多