【发布时间】:2016-04-30 23:29:15
【问题描述】:
我需要浏览我网页上的所有页面。所有这些页面的左上角都有一个下拉框,其中包含所有可用的城市。我想通过选择此下拉框中的每个位置来访问每个页面。下拉框有一个滚动条,当我想选择它下面的选项时,它会给我异常消息:
Message: Element is not currently visible and so may not be interacted with
Stacktrace:
at fxdriver.preconditions.visible (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:9981)
at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12517)
at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12534)
at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12539)
at DelayedCommand.prototype.execute/< (file:///tmp/tmpHWLMyH/extensions/fxdriver@googlecode.com/components/command-processor.js:12481)
代码如下:
#!/bin/env/python
# -*- coding: utf-8 -*-
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
def get_browser():
return webdriver.Firefox()
main_page_url = "http://example.com/"
basic_url = 'http://example.com/ogloszenia-kobiet.html'
def get_city_list(url) :
AGE_ACCEPT_BUTTON_XPATH = ".//*[@id='columns']/div/div[2]/section/div/div/div/div/div/div[2]/div[2]/a[2]"
COMBOBOX_XPATH = ".//*[@id='select_city']/li/form/div/button"
COMBOBOX_OPTION_XPATH = ".//*[@id='select_city']/li/form/div/div/ul/li[%s]/a/span[1]"
CHOOSE_BUTTON_XPATH = ".//*[@id='select_city']/li/form/button"
pages = []
try:
browser = get_browser()
wait = WebDriverWait(browser, 100)
browser.get(main_page_url)
time.sleep(2)
button_age_accept = browser.find_element_by_xpath(AGE_ACCEPT_BUTTON_XPATH)
button_age_accept.click()
time.sleep(10)
browser.get(url)
i = 2
while(True) :
try :
button_combobox = browser.find_element_by_xpath(COMBOBOX_XPATH)
button_combobox.click()
time.sleep(5)
element_xpath = COMBOBOX_OPTION_XPATH % i
option_in_combobox = browser.find_element_by_xpath(element_xpath)
# wait.until(EC.invisibility_of_element_located((By.XPATH, element_xpath)))
# option_in_combobox = WebDriverWait(browser, 10).until(lambda browser : browser.find_element_by_xpath(element_xpath))
option_in_combobox.click()
time.sleep(5)
button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH)
button_choose.click()
time.sleep(5)
pages.append(browser.current_url)
i += 1
except Exception, e:
print e
break
browser.close()
return pages
except Exception, e:
info = 'Generic exception\n'
print e
return []
get_city_list(basic_url)
我也尝试使用滚动条,尝试将其向下移动,但仍然没有效果。我只能滚动位于此下拉框顶部的页面:
#!/bin/env/python
# -*- coding: utf-8 -*-
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
def get_browser():
return webdriver.Chrome()
main_page_url = "http://example.com/"
basic_url = 'http://example.com/ogloszenia-kobiet.html'
def get_city_list(url) :
AGE_ACCEPT_BUTTON_XPATH = ".//*[@id='columns']/div/div[2]/section/div/div/div/div/div/div[2]/div[2]/a[2]"
COMBOBOX_XPATH = ".//*[@id='select_city']/li/form/div/button"
COMBOBOX_OPTION_XPATH = ".//*[@id='select_city']/li/form/div/div/ul/li[%s]/a/span[1]"
CHOOSE_BUTTON_XPATH = ".//*[@id='select_city']/li/form/button"
pages = []
try:
browser = get_browser()
wait = WebDriverWait(browser, 100)
browser.get(main_page_url)
time.sleep(2)
button_age_accept = browser.find_element_by_xpath(AGE_ACCEPT_BUTTON_XPATH)
button_age_accept.click()
time.sleep(10)
browser.get(url)
i = 2
while(True) :
try :
button_combobox = browser.find_element_by_xpath(COMBOBOX_XPATH)
button_combobox.click()
time.sleep(5)
element_xpath = COMBOBOX_OPTION_XPATH % i
option_in_combobox = browser.find_element_by_xpath(element_xpath)
actionChains = ActionChains(browser)
scrollbar = browser.find_element_by_xpath("/html/body/section/section[2]/div/div[2]/section/div/div/div/div[1]/ul/li/form/div/div/ul")
actionChains.click_and_hold(scrollbar).perform()
actionChains.move_by_offset(0,10+i).perform()
actionChains.release()
browser.execute_script("arguments[0].scrollIntoView();", option_in_combobox)
option_in_combobox.click()
browser.execute_script("window.scrollTo(0, 0);")
button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH)
button_choose.click()
time.sleep(5)
pages.append(browser.current_url)
i += 1
except Exception, e:
print e
break
browser.close()
return pages
except Exception, e:
info = 'Generic exception\n'
print e
return []
pages = get_city_list(basic_url)
for p in pages :
with open('links.txt', 'a') as the_file:
the_file.write(p)
the_file.write('\n')
------------------------------------------ -------------------------------------------------- -------------------------------------- 更新: ----------------------------------------------- -------------------------------------------------- ----------------------------------
现在,我使用的是Kubuntu 14.04。我有Python 2.7.11 和Selenium 2.49.2。我当前的代码:
#!/bin/env/python
# -*- coding: utf-8 -*-
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
# def get_browser():
# options = webdriver.ChromeOptions()
# options.add_argument("--start-maximized")
# return webdriver.Chrome(chrome_options=options)
def get_browser():
return webdriver.Firefox()
main_page_url = "http://example.com/"
basic_url = 'http://example.com/ogloszenia-kobiet.html'
def get_city_list(url) :
AGE_ACCEPT_BUTTON_XPATH = ".//*[@id='columns']/div/div[2]/section/div/div/div/div/div/div[2]/div[2]/a[2]"
COMBOBOX_XPATH = ".//*[@id='select_city']/li/form/div/button"
COMBOBOX_OPTION_XPATH = ".//*[@id='select_city']/li/form/div/div/ul/li[%s]/a/span[1]"
CHOOSE_BUTTON_XPATH = ".//*[@id='select_city']/li/form/button"
pages = []
try:
browser = get_browser()
wait = WebDriverWait(browser, 100)
browser.get(main_page_url)
time.sleep(2)
button_age_accept = browser.find_element_by_xpath(AGE_ACCEPT_BUTTON_XPATH)
button_age_accept.click()
time.sleep(10)
browser.get(url)
i = 2
while(True) :
try :
button_combobox = browser.find_element_by_xpath(COMBOBOX_XPATH)
button_combobox.click()
time.sleep(5)
element_xpath = COMBOBOX_OPTION_XPATH % i
option_in_combobox = browser.find_element_by_xpath(element_xpath)
option_in_combobox.click()
button_choose = browser.find_element_by_xpath(CHOOSE_BUTTON_XPATH)
button_choose.click()
time.sleep(5)
pages.append(browser.current_url)
i += 1
except Exception, e:
print e
break
browser.close()
return pages
except Exception, e:
info = 'Generic exception\n'
print e
return []
pages = get_city_list(basic_url)
for p in pages :
with open('links.txt', 'a') as the_file:
the_file.write(p)
the_file.write('\n')
对于 Firefox,代码在元素“Gdańsk”处退出并显示一条消息:string indices must be integers,因此这意味着它没有找到我的组合框中的每个元素。
对于 Chrome 和 Windows XP,它在 'Bielsko-Biała' 处退出,所以这意味着它没有找到我的组合框中的每个元素。 ...
我该如何解决这个问题?
【问题讨论】:
-
请记住,该网站的用户年仅 13 岁,并且是工作中访问该网站的专业人士,请不要链接到您的问题中包含裸露内容的网站。在问题本身中包含足够的详细信息,以便可以回答问题。