我正在尝试在http://www.yifysubtitles.com网站上使用Selenium在Python 2.7上实现一个简单的子下载程序。
我在Selenium中实现隐式或显式等待时遇到了严重的麻烦 - 肯定是由于无知而不是代码造成的。
我最终选择了破坏所有time.sleep()
解决方案。该程序有效,但我想要一个更程序化的解决方案和更漂亮的代码。
以下是包含隐式和显式等待的代码:
user_input = raw_input("Enter the movie of interest: ")
profile = SetProfile()
browser = webdriver.Firefox(profile)
# browser.implicitly_wait(30)
WindowSize(400, 400)
browser.get(url)
print "Searching..."
search_bar = browser.find_element_by_id("qSearch")
click_button = browser.find_element_by_class_name("glyphicon")
#wait_1 = WebDriverWait(browser, 50)
#cookie_element = wait_1.until(EC.element_to_be_clickable((By.CLASS_NAME,"cc_btn.cc_btn_accept_all")))
time.sleep(5)
accept_cookies_btn = browser.find_element_by_class_name("cc_btn.cc_btn_accept_all")
search_bar.clear()
accept_cookies_btn.click()
search_bar.send_keys(user_input)
search_bar.send_keys(Keys.RETURN)
time.sleep(10)
#wait_2 = WebDriverWait(browser, 50)
#result_element = wait_2.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "h3.media-heading")))
result = browser.find_element_by_class_name("media-heading")
result.click()
print "Movie found!"
time.sleep(10)
req = requests.get(browser.current_url)
soup = BeautifulSoup(req.text)
link_to_sub = ResultParser(soup)
print "Choosing the best eng. subtitle..."
browser.get(url+link_to_sub[1])
download_button = browser.find_element_by_class_name("btn-icon")
download_button.click()
time.sleep(10)
browser.quit()
print "Enjoy!"
我已经注释掉了我试图使用的等待(显式或隐式)。实际上,如果我使用等待而不是time.sleep
,Selenium会向我扔ElementNotVisibleException
。
因此,我在等待时出错吗?
关于隐式等待,当我运行程序时,Selenium总是向我抛出ElementNotVisibleException: Message:
(消息为空),无论等待长度如何(尝试5,30和100!)。
当我使用显式等待时,类似地,Selenium要么抛出ElementNotVisibleException
,要么似乎使用前一页中的DOM。实际上,在最后一种情况下,等待是在点击结果之后,但我得到了上一页的标题......
正如我所说,当我使用time.sleep()
时,Selenium会毫无困难地找到元素。
一个简单问题的长信息:为什么我的等待似乎不起作用?