Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用seelnium ide和python在xpath上进行两次循环后,程序失败_Python_Selenium_Selenium Webdriver - Fatal编程技术网

使用seelnium ide和python在xpath上进行两次循环后,程序失败

使用seelnium ide和python在xpath上进行两次循环后,程序失败,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,两次迭代后,它失败并显示错误 若发生这种情况是因为SeleniumIDE并没有找到xpath,那个么为什么它在循环的第二次迭代中并没有失败呢 我怎样才能在没有任何错误的情况下获得输出并逐个命中所有8个URL xpath是否可用 这是我的密码: from selenium import webdriver from selenium.webdriver.common.keys import Keys #base Url baseurl="http://www.incredibleindia.or

两次迭代后,它失败并显示错误

若发生这种情况是因为SeleniumIDE并没有找到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/fxdriver@googlecode.com/components/driver-component.js:10245)
at FirefoxDriver.prototype.findElementsInternal_ (file:///tmp/tmpDolyM9/extensions/fxdriver@googlecode.com/components/driver-component.js:10303)
at fxdriver.Timer.prototype.setTimeout/<.notify (file:///tmp/tmpDolyM9/extensions/fxdriver@googlecode.com/components/driver-component.js:603)
8
http://www.incredibleindia.org/en/travel
tabl链接一个接一个
http://www.incredibleindia.org/en/trade
tabl链接一个接一个
http://www.incredibleindia.org/en/#media
tabl链接一个接一个
回溯(最近一次呼叫最后一次):
文件“incredibleindia.py”,第27行,在
travel\u tabs\u sublinks=driver.find\u elements\u by\u xpath(“./*[@id='left-internal content']/div[2]/div/ul/li/a”)
文件“/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py”,第244行,按xpath查找元素
返回self.find_元素(by=by.XPATH,value=XPATH)
文件“/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py”,第679行,在find_元素中
{'using':by'value':value})['value']
文件“/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py”,执行中的第175行
self.error\u handler.check\u响应(响应)
文件“/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py”,第166行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.InvalidSelectorException:消息:给定的选择器。//*[@id='left-internal-content']/div[2]/div/ul/li/a无效或未生成WebElement。发生以下错误:
InvalidSelectorError:由于以下错误,无法找到具有xpath表达式的元素。//*[@id='left-internal-content']/div[2]/div/ul/li/a:
TypeError:Document.createNSResolver的参数1不是对象。
堆栈跟踪:
在FirefoxDriver.AnnotationInvalidSelectorError\u(file:///tmp/tmpDolyM9/extensions/fxdriver@googlecode.com/components/driver component.js:10245)
在FirefoxDriver.prototype.findelement内部(file:///tmp/tmpDolyM9/extensions/fxdriver@googlecode.com/components/driver component.js:10303)

首先,在fxdriver.Timer.prototype.setTimeout/中,您没有正确使用。它不仅会休眠N秒,实际上会立即执行-它告诉驱动程序每次搜索元素时需要等待多少时间:

隐式等待是告诉WebDriver轮询DOM一段时间 尝试查找一个或多个元素(如果有)的时间量 目前还没有。默认设置为0。一旦设置,则 为WebDriver对象实例的生命周期设置隐式等待

相反,您需要使用。以下是代码的改进工作版本:

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
...

如何使用xpath和显式等待,就像我在隐式等待中使用的那样。我想使用xpath打印所有链接和子链接。您是如何在WebDriverWait(driver,10)中找到CSS选择器的。直到(EC.presence\u of_element\u located((By.CSS\u selector,“div.menu li>a”)@user3902208对于xpath,将
替换为
By.CSS\u selector
。我通过在browser developer tools中检查页面源代码找到了选择器。希望能有所帮助。在这个程序中,我点击了主URL,然后点击了子URL和它的子URL等等,然后从特定的链接中检索数据。看起来我们可以用递归函数来完成。您能为我提供您上面提到的代码的递归函数解决方案吗?@user3902208您能将其详细阐述成一个单独的SO问题吗?这样您可以从其他人那里获得帮助,我们会保持它的干净。在这里也给我一个这个问题的链接。非常感谢。