2017-06-16 74 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

相關問題