2015-01-26 68 views
3

我需要你的帮助。我试图使用Python 2.7中的Selenium从tripadvisor中获取一些数据。但是,我陷入了一个困境。Python Selenium - '无法定位元素'后显示

浏览到正确的页面后,我试图过滤某些价格的酒店。要做到这一点,你可以做一个鼠标或点击'价格',然后选择合适的价格,如(€3 - €13)。

点击价格然后点击价值。我收到了元素不可见或无法找到的错误,但它清晰可见。

代码

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

city = 'nha thrang' 


url = 'http://www.tripadvisor.nl/Hotels' 

driver = webdriver.Firefox() 

# open browser 
driver.get(url) 
time.sleep(5) 

# insert city & dates 
driver.find_element_by_id('searchbox').send_keys(city) 
driver.find_element_by_id('date_picker_in_188616').click() 
driver.find_elements_by_class_name('day')[15].click() 
driver.find_element_by_id('date_picker_out_188616').click() 
driver.find_elements_by_class_name('day')[16].click() 

time.sleep(5) 

# click search 
driver.find_element_by_id('SUBMIT_HOTELS').click() 

# close popup 
time.sleep(5) 
try: 
    driver.switch_to.window(driver.window_handles[1]) 
    driver.close() 
    driver.switch_to.window(driver.window_handles[0]) 
except: 
    '' 

# click on 'price'. Works! 
driver.find_element_by_xpath('//div[starts-with(@class, "JFY_hotel_filter_icon enabled price sprite-price")]').click() 

# click on particular price. doesn't work. 
driver.find_element_by_xpath('//div[starts-with(@class, "jfy_tag_style jfy_filter_p_4 jfy_cloud")]').click() 

错误

Traceback (most recent call last): 
File "<pyshell#30>", line 1, in <module> 
driver.find_element_by_xpath('//div[starts-with(@class, "jfy_tag_style jfy_filter_p_4 jfy_cloud")]').click() 
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 230, in find_element_by_xpath 
return self.find_element(by=By.XPATH, value=xpath) 
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 662, in find_element 
{'using': by, 'value': value})['value'] 
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 173, in execute 
self.error_handler.check_response(response) 
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 166, in check_response 
raise exception_class(message, screen, stacktrace) 
NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//div[starts-with(@class, \"jfy_tag_style jfy_filter_p_4 jfy_cloud\")]"} 
Stacktrace: 
at FirefoxDriver.prototype.findElementInternal_ (file:///c:/users/j6057~1.kro/appdata/local/temp/tmpdgovsc/extensions/[email protected]/components/driver-component.js:9641:26) 
at FirefoxDriver.prototype.findElement (file:///c:/users/j6057~1.kro/appdata/local/temp/tmpdgovsc/extensions/[email protected]/components/driver-component.js:9650:3) 
at DelayedCommand.prototype.executeInternal_/h (file:///c:/users/j6057~1.kro/appdata/local/temp/tmpdgovsc/extensions/[email protected]/components/command-processor.js:11635:16) 
at DelayedCommand.prototype.executeInternal_ (file:///c:/users/j6057~1.kro/appdata/local/temp/tmpdgovsc/extensions/[email protected]/components/command-processor.js:11640:7) 
at DelayedCommand.prototype.execute/< (file:///c:/users/j6057~1.kro/appdata/local/temp/tmpdgovsc/extensions/[email protected]/components/command-processor.js:11582:5) 

回答

2

您需要申请多次更改,使其工作:

工作码(选择“25美元 - 50" 的范围):

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


city = 'nha thrang' 

url = 'http://www.tripadvisor.nl/Hotels' 
driver = webdriver.Chrome() 
driver.get(url) 

# insert city & dates 
searchbox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'searchbox'))) 
searchbox.send_keys(city) 

driver.find_element_by_xpath('//span[starts-with(@id, "date_picker_in_")]').click() 
driver.find_elements_by_class_name('day')[15].click() 

driver.find_element_by_xpath('//span[starts-with(@id, "date_picker_out_")]').click() 
driver.find_elements_by_class_name('day')[16].click() 

# click search 
driver.find_element_by_id('SUBMIT_HOTELS').click() 

# select price range 
price = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[starts-with(@class, "JFY_hotel_filter_icon enabled price sprite-price")]'))) 

ActionChains(driver).move_to_element(price).perform() 

price_range = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '(//div[contains(@class, "jfy_filter_bar_price")]//div[@value="p 8"])[last()]'))) 
price_range.click() 

结果为:

enter image description here

0

我得到了相同的回溯,尝试添加此之前找到自己的元素:

driver.switch_to_window(driver.window_handles[1])#locate the first new page (handles) 

反正我的作品