2015-06-19 3 views
0
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() 

Я пытаюсь ползти через сайт YouTube с помощью связывания селена питона, но он дает ошибку в строке 20 тайм-аута ошибки исключения. Я думаю, что это связано с тегом span, который не отображается. Поэтому, пожалуйста, предоставить мне способ, как решить эту проблему, генерируемыйпитон селеном: selenium.common.exceptions.TimeoutException: Сообщение: линия 20

ошибка: // selenium.common.exceptions.TimeoutException: Сообщение: линия 20

ответ

0

В общем, ваше выражение XPath является очень хрупким - не полагаются на макеты-ориентированные классы, как yt-uix-button-size-small или yt-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()