2016-12-07 1236 views
0

我使用python中的selenium訪問名爲iens的網站。我希望我的腳本點擊「Volgende」(意即荷蘭語中的「Next」),以移至下一頁。但是,我收到以下錯誤消息:使用python + selenium點擊按鈕

selenium.common.exceptions.WebDriverException: Message: unknown error: 
Element is not clickable at point (853, 667). Other element would 
receive the click: <div class="cookiePolicy-content">...</div> 

我認爲在硒進入網站時彈出的Cookie出現問題。到目前爲止,我還沒有能夠找到我能做些什麼來移動Cookie。

我的代碼迄今:

from selenium import webdriver 

chrome_path = '/Users/username/Downloads/chromedriver' 
driver = webdriver.Chrome(chrome_path) 
driver.get('https://www.iens.nl/restaurant+utrecht') 

link = driver.find_element_by_link_text("Volgende") 
link.click() 

這是網站:https://www.iens.nl/restaurant+utrecht

+0

如果你看看它說的cookie政策消息將接收點擊事件的消息,因爲即使當硒試圖滾動Volgende按鈕進入視圖中,cookie策略消息將浮動在按鈕上,因此它不會被點擊 – Corporalis

回答

2

是的,這是由於cookie浮動底部在底部。 Selenium會將你的按鈕滾動到視圖中,但它沒有意識到它需要將它滾動到cookie浮動div上方。

我建議或者點擊cookie消息上的關閉按鈕,或者從cookie消息後面滾動元素。

要關閉的cookie,你會想點擊關閉,並等待它消失:

編輯:

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


chrome_path = '/Users/username/Downloads/chromedriver' 
driver = webdriver.Chrome(chrome_path) 
driver.get('https://www.iens.nl/restaurant+utrecht') 

# Wait for cookie message 
close_icon = WebDriverWait(driver, 5, 0.25).until(ec.visibility_of_element_located([By.CSS_SELECTOR, '.cookiePolicy-close'])) 
close_icon.click() 
# Wait for cookie message to disappear 
WebDriverWait(driver, 5, 0.25).until(ec.invisibility_of_element_located([By.CSS_SELECTOR, '.cookiePolicy-close'])) 
link = driver.find_element_by_link_text("Volgende") 
link.click() 

要從cookie的消息背後滾動元素,它出現這個頁面也有一個浮動頂部標題,所以你實際上不能將它滾動到頁面頂部......你需要從cookie消息後面滾動它。

from selenium import webdriver 

chrome_path = '/Users/username/Downloads/chromedriver' 
driver = webdriver.Chrome(chrome_path) 
driver.get('https://www.iens.nl/restaurant+utrecht') 

link = driver.find_element_by_link_text("Volgende") 
# Scroll to element as Selenium would 
driver.execute_script('arguments[0].scrollIntoView(false);', link) 
# Then scroll it up to get it out from behind the message 
driver.execute_script('window.scrollBy(0, 200)') 
link.click() 

編輯:我已經證實了這兩個選項的作用

+0

非常感謝!如果你沒有太多時間,我將如何編寫一個循環,點擊下一頁,直到程序在最後一頁? – titusAdam

+1

你需要它循環瀏覽每個頁面嗎?或者你只是想到最後一頁?最後一頁的'next'按鈕旁邊有一個鏈接 –

+1

如果你需要循環訪問頁面,你應該可以通過將所有內容放在'driver.get'中的while循環中來實現......'while '禁用'不在driver.find_element_by_css_selector('li.next')。get_attribute('class'):' –

0

試試這個,而不是driver_find_element_by_link_text()

driver.find_element_by_xpath('//*[@id="pagination_results"]/div/div/ul/li[14]/a'); 
0

硒試圖模擬真實用戶的行爲。這意味着它只能點擊可見元素。您需要將元素放在視圖中才能點擊它

link = driver.find_element_by_link_text("Volgende") 
ActionChains(driver).move_to_element(link).perform() 
link.click() 
+0

Selenium會在點擊它之前自動將元素滾動到視口中。他遇到的問題是,它背後是一個浮動元素,Selenium不會考慮 –