2015-03-13 28 views
1

兩次迭代後失敗並顯示錯誤。在xpath使用seelnium ide和python循環執行兩次迭代後失敗我的程序

如果發生這種情況是因爲沒有通過selenium ide找到xpath,那麼爲什麼它在循環的第二次迭代中不會失敗。

如何在沒有任何錯誤的情況下獲得輸出,並且一個一個地點擊所有8個Url或者xpath可用或不可用。

這裏是我的代碼:

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

#base Url 
baseurl="http://www.incredibleindia.org" 
driver = webdriver.Firefox() 
driver.implicitly_wait(2) 
driver.get(baseurl) 

driver.implicitly_wait(2) 
main_links_tabs=driver.find_elements_by_xpath("html/body/div[3]/div/div[1]/div[2]/ul/li/a") 
all_tablength=len(main_links_tabs) 
print all_tablength 
main_link_list=[] 
for i in range(all_tablength): 
    driver.implicitly_wait(3) 
    links=main_links_tabs[i].get_attribute('href') 
    main_link_list.append(links) 
#all main_tab_link hit one by one 
for i in main_link_list: 
    print i 
    driver.implicitly_wait(30) 
    driver.get(i) 

    #travel tabs data 
    print "tabl links hit one by one" 

    travel_tabs_sublinks=driver.find_elements_by_xpath(".//*[@id='left-inner-content']/div[2]/div/ul/li/a") 

    travel_tabs_sublinks_len=len(travel_tabs_sublinks) 
    print travel_tabs_sublinks_len 

輸出:

所有的
8 
http://www.incredibleindia.org/en/travel 
tabl links hit one by one 
http://www.incredibleindia.org/en/trade 
tabl links hit one by one 
http://www.incredibleindia.org/en/#media 
tabl links hit one by one 
Traceback (most recent call last): 
File "incredibleindia.py", line 27, in <module> 
travel_tabs_sublinks=driver.find_elements_by_xpath(".//*[@id='left-  inner-content']/div[2]/div/ul/li/a") 
File "/usr/local/lib/python2.7/dist-  packages/selenium/webdriver/remote/webdriver.py", line 244, in  find_elements_by_xpath 
return self.find_elements(by=By.XPATH, value=xpath) 
File "/usr/local/lib/python2.7/dist- packages/selenium/webdriver/remote/webdriver.py", line 679, in find_elements 
{'using': by, 'value': value})['value'] 
File "/usr/local/lib/python2.7/dist- packages/selenium/webdriver/remote/webdriver.py", line 175, in execute 
self.error_handler.check_response(response) 
File "/usr/local/lib/python2.7/dist- packages/selenium/webdriver/remote/errorhandler.py", line 166, in check_response 
raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.InvalidSelectorException: Message: The given selector .//*[@id='left-inner-content']/div[2]/div/ul/li/a is either invalid or does not result in a WebElement. The following error occurred: 
InvalidSelectorError: Unable to locate an element with the xpath expression .//*[@id='left-inner-content']/div[2]/div/ul/li/a because of the following error: 
TypeError: Argument 1 of Document.createNSResolver is not an object. 
Stacktrace: 
at FirefoxDriver.annotateInvalidSelectorError_ (file:///tmp/tmpDolyM9/extensions/[email protected]/components/driver-component.js:10245) 
at FirefoxDriver.prototype.findElementsInternal_ (file:///tmp/tmpDolyM9/extensions/[email protected]/components/driver-component.js:10303) 
at fxdriver.Timer.prototype.setTimeout/<.notify (file:///tmp/tmpDolyM9/extensions/[email protected]/components/driver-component.js:603) 

回答

2

首先,你沒有正確使用implicitly_wait()。它不會睡眠N秒,實際上它會立即執行 - 它說驅動程序每次搜索元素時需要等待多長時間:

隱式等待是告訴WebDriver輪詢DOM對於某個 嘗試查找一個或多個元素的時間量,如果它們不是立即可用的,則爲 。默認設置爲0.一旦設置, 隱式等待設置爲WebDriver對象實例的生命週期。

取而代之,您需要使用Explicit Waits。這裏是代碼的改進工作版本:

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


url = "http://www.incredibleindia.org" 
driver = webdriver.Firefox() 
driver.get(url) 

# wait for menu to being loaded 
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.menu li > a"))) 

links = [a.get_attribute('href') for a in driver.find_elements_by_css_selector('div.menu li > a')] 
for link in links: 
    driver.get(link) 

    # wait for menu to being loaded 
    try: 
     WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div#left-inner-content li > a"))) 
    except TimeoutException: 
     print driver.title, "No sublinks" 

    sublinks = driver.find_elements_by_css_selector("div#left-inner-content li > a") 
    print driver.title, [sublink.text for sublink in sublinks] 

打印:

Incredible India - Travel [u'Rural Tourism', u'Mountain Trains & Luxury Trains', u'Eco Tourism', u'MICE', u'All Destinations'] 
Incredible India - Trade No sublinks 
... 
+0

如何使用XPath具有顯式等待,因爲我在等待隱含使用。我想用xpath打印所有鏈接和子鏈接。 – Mukesh 2015-03-13 07:18:01

+0

您是如何在WebDriverWait(驅動程序,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,「div.menu li> a」))) – Mukesh 2015-03-13 07:45:43

+0

@ user3902208中找到CSS選擇器的,對於xpath,將'By.CSS_SELECTOR'與'By.XPATH'。我通過在瀏覽器開發工具中檢查頁面源來找到選擇器。希望有所幫助。 – alecxe 2015-03-13 13:18:48

相關問題