python selenium:selenium.common.exceptions.TimeoutException:消息:第20行

时间:2015-06-19 10:37:57

标签: python python-3.x selenium selenium-webdriver

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import  time

driver = webdriver.Firefox()
driver.get("http://www.youtube.com")
assert "YouTube" in driver.title

def waiter(browser):
    elements = browser.find_element_by_xpath(filterButton)
    if len(elements) != 0:
        return elements
    return False

search = "//input[@id='masthead-search-term']"
searchButton = "//button[@id='search-btn']"
filterButton = "//button[@class='yt-uix-button yt-uix-button-size-small yt-uix-button-default filter-button yt-uix-expander-head yt-uix-button-toggled']"
textFieldElement = WebDriverWait(driver, 10).until(lambda driver1: driver.find_element_by_xpath(search))
textFieldElement.clear()
textFieldElement.send_keys("How to iron the clothes")
searchButtonElement = WebDriverWait(driver, 10).until(lambda driver1: driver.find_element_by_xpath(searchButton))
searchButtonElement.click()
filterButtonElement = WebDriverWait(driver, 20).until(waiter)
filterButtonElement.clickandWait()
time.sleep(10)
driver.quit()

我正在尝试使用selenium python绑定爬过youtube站点,但它在超时异常错误的第20行上出错。我认为这是由于span标记不可见。所以请提供一个解决此问题的方法

  

生成错误:// selenium.common.exceptions.TimeoutException:   消息:第20行

1 个答案:

答案 0 :(得分:0)

通常,您的XPath表达式非常脆弱 - 不依赖于面向布局的类,如yt-uix-button-size-smallyt-uix-expander-head。相反,例如,依赖于"过滤器"。

的按钮文本

使用built-in Expected Conditions

,而不是使用自定义等待功能
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


driver = webdriver.Firefox()
driver.get("http://www.youtube.com")
wait = WebDriverWait(driver, 10)

textFieldElement = wait.until(EC.visibility_of_element_located((By.ID, "masthead-search-term")))
textFieldElement.clear()
textFieldElement.send_keys("How to iron the clothes")

searchButtonElement = wait.until(EC.visibility_of_element_located((By.ID, "search-btn")))
searchButtonElement.click()

filterButtonElement = wait.until(EC.visibility_of_element_located((By.XPATH, "//button[span = 'Filters']")))
filterButtonElement.click()