【问题标题】:How to handle the timeout exception in python如何处理python中的超时异常
【发布时间】:2014-09-19 17:17:58
【问题描述】:

我正在编写一个机器人来跟踪 www.quora.com 上的用户。以下是我正在使用的部分代码,其中出现超时异常:

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

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
time.sleep(10)

wait = WebDriverWait(driver, 10)

form = driver.find_element_by_class_name('regular_login')
time.sleep(10)
#add explicit wait

username = form.find_element_by_name('email')
time.sleep(10)
#add explicit wait

username.send_keys('abc@gmail.com')
time.sleep(30)
#add explicit wait

password = form.find_element_by_name('password')
time.sleep(30)
#add explicit wait

password.send_keys('def')
time.sleep(30)
#add explicit wait

password.send_keys(Keys.RETURN)
time.sleep(30)

#search = driver.find_element_by_name('search_input')
search = wait.until(EC.presence_of_element_located((By.XPATH, "//form[@name='search_form']//input[@name='search_input']")))

search.clear()
search.send_keys('Kevin Rose')
search.send_keys(Keys.RETURN)

link = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "Kevin Rose")))
link.click()
#Wait till the element is loaded (Asynchronusly loaded webpage)

handle = driver.window_handles
driver.switch_to.window(handle[1])
#switch to new window 

element = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Followers")))
time.sleep(30)
element.click()
#goes to Kevin Rose followers page
time.sleep(30)

button = driver.find_elements_by_xpath("//a[contains(text(), 'Follow')]")
#Locate follow button on the page
no_of_followers = len(button)
#total number of unfollowed users
print no_of_followers


    while(no_of_followers > 0):
    # execute only if there are unfollowed users on page

        count = 1

        while(count < no_of_followers):

            time.sleep(30)
            link = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "Follow")))
            time.sleep(30)
            link.click()
            time.sleep(30)
            print count
            count = count + 1


        time.sleep(30)
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(30)
        button = driver.find_elements_by_xpath("//a[contains(text(), 'Follow')]")
        time.sleep(30)
        no_of_followers = len(button)

执行代码后,我在成功执行一次后内部循环中出现“TimeoutException”错误。

我该如何解决这个问题?

追溯:

Traceback(最近一次调用最后一次):文件“C:\Python27\quorabot7”, 第 72 行,在 链接 = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "Follow"))) 文件 "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", 第 71 行,直到 raise TimeoutException(message) TimeoutException: Message: ''

【问题讨论】:

  • 请包含完整的 Traceback。
  • 另外,请将完整的代码贴出来,以便我们逐步复现和调试。谢谢。
  • 发布了完整的代码和回溯。

标签: python python-2.7 selenium-webdriver web-scraping bots


【解决方案1】:

您收到 TimeoutException 是因为 Selenium 在您设置的等待时间内找不到该元素。这意味着您的定位器策略不正确。

我还没有测试过你的其他定位器,但如果确实是内部循环失败了......我的解决方案如下。

在查看了 Kevin Hart 页面上的 DOM 后,我可以看到您感兴趣的按钮是:

<a class="follow_button with_count" href="#" action_click="UserFollow" id="__w2_Mab4s9V_follow_user">Follow<span class="count">43.8k</span></a>

你应该试试这个:

link = wait.until(EC.presence_of_element_located(\
       (By.className, "follow_button with_count")))

或者这个:

link = wait.until(EC.presence_of_element_located(\
       (By.XPATH, '//a[@action_click="UserFollow"]')))

【讨论】:

  • 谢谢。有效。但是你能解释一下为什么“link = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "Follow")”失败了吗?
  • 这可能与LINK_TEXT定位器策略和您感兴趣的按钮有关。我不做网络自动化(我做移动)所以我对LINK_TEXT不太熟悉。跨度>
  • 啊。实际上,这可能是因为跨度位于 a 标记内,因此您需要将其作为 LINK_TEXT 的值提供为“Follow 49.7k”。
【解决方案2】:

正确的是By.CLASS_NAME,而不是By.ClassName

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多