2017-06-16 81 views
1

我想弄清楚如何使用硒执行下一页单击新闻发布页面上。这是我的代码,将转到正确的网站并执行搜索以获取正确的新闻发布文章主题页。此网站已配置为在搜索执行后查看第1页上的每个新闻稿,您还必须选择页面底部的更多新闻结果按钮。我能够毫无问题地进入整个第1页的新闻栏目。这是我的代码,执行搜索和页面点击。ElementNotVisibleException下一页按钮单击时出现Python/Selenium错误

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

browser = webdriver.Chrome() 
browser.get('http://www.businesswire.com/portal/site/home/') 
search_box_element = browser.find_element_by_id('bw-search-input') 
search_box_element.clear() 
search_box_element.send_keys('biotechnology') 
search_box_element.send_keys(Keys.ENTER) 
search_box_element_two = browser.find_element_by_id('more-news-results') 
search_box_element_two.click() 

这部分的代码工作正常,但我希望能够点击下一步按钮移动到等2页,然后第3页和。下面是我认为会的工作代码,但它不会:

next_page_click_element = browser.find_element_by_class_name("bw-paging-next") 
next_page_click_element.click() 

的这部分代码抛出一个错误:

selenium.common.exceptions.ElementNotVisibleException: Message: 
element not visible 

我一直在使用

next_page_click_element = browser.find_element_by_xpath('//*[@id="more-news-pagination"]/div/div[1]/div/a') 

也尝试但得到了相同的错误信息。我还尝试在next_page_click_element部分之前添加这些代码行。

element_present = EC.presence_of_element_located((By.ID, "bw-paging-next")) 
WebDriverWait(browser, 10).until(element_present) 

虽然这确实会导致程序等待它返回此错误消息:

raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 

就如何解决这个问题的任何建议,将不胜感激。

+0

试着用'(By.CLASS_NAME,“bw-paging-next”)替换'(By.ID,“bw-paging-next”)'' – Andersson

+0

嗨,谢谢你的回应。不幸的是,这是行不通的。用By.CLASS_NAME替换By.ID会返回我的原始元素不可见错误消息。这种变化不会导致等待时间的发生。 – user3798654

+0

尝试在点击 – Andersson

回答

1

这里是回答你的问题:

有关解决方案 -

  1. 几句话的Page 2Page 3Next等元素在页面的底部,你必须滚动以便将这些元素带入Viewport
  2. 一旦向下滚动,您可能会考虑引入一些ExplicitWait元素以在HTML DOM上正确定位。
  3. 这里是你自己的代码有一些简单的调整,这将最终滚动到页面底部,然后点击Next链接:

    from selenium import webdriver 
    from selenium.webdriver.common.keys import Keys 
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC 
    from selenium.webdriver.common.by import By 
    
    browser=webdriver.Chrome("C:\\Utility\\BrowserDrivers\\chromedriver.exe") 
    browser.get('http://www.businesswire.com/portal/site/home/') 
    search_box_element = browser.find_element_by_id('bw-search-input') 
    search_box_element.clear() 
    search_box_element.send_keys('biotechnology') 
    search_box_element.send_keys(Keys.ENTER) 
    search_box_element_two = browser.find_element_by_id('more-news-results') 
    search_box_element_two.click() 
    last_height = browser.execute_script("return document.body.scrollHeight") 
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    next_page_click_element = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.XPATH, "//div[@id='more-news-pagination']/div/div/div/a[text()='Next']")) 
    ) 
    next_page_click_element.click() 
    

让我知道如果这个回答你的问题。

+0

为什么在'ExplicitWait'之前使用'time.sleep()'? :) – Andersson

+0

DebanjanB,谢谢你的回应。您的解决方案奏效对此,我真的非常感激。乔治 – user3798654

+0

安德森,我认为你是在正确的轨道上。感谢您的帮助。 – user3798654

相关问题