2017-05-25 33 views
0
driver = webdriver.PhantomJS() 
driver.set_window_size(1920, 1080) 
driver.get('https://soundcloud.com/') 
driver.implicitly_wait(5) 
driver.set_page_load_timeout(5) 
#driver.save_screenshot('screen.png') 
signIn_button = driver.find_element_by_xpath("//button[@class='g-opacity-transition frontHero__loginButton g-button-transparent-inverted sc-button sc-button-medium loginButton']") 
signIn_button.click() 
driver.implicitly_wait(5) 
#driver.save_screenshot('screenie.png') 
#emailField = driver.find_element_by_css_selector('form#loginForm input[placeholder="Your email address or profile URL *"]')Your email address or profile URL * 
emailField = driver.find_element_by_xpath("//input[@class='textfield__input sc-input sc-input-large'][@type='text']") 
emailField.click() 
driver.implicitly_wait(5) 
emailField.send_keys(account.email) 
driver.implicitly_wait(5) 
emailField.send_keys(Keys.RETURN) 

當線driver.save_screenshot('screenie.png')是在代碼,該程序的功能正常,正確地在emailField與正確的串入。但是,如果刪除了此代碼,程序將無法操作此文本字段並引發錯誤:拿走硒截圖功能使得程序失敗 - 的Python

selenium.common.exceptions.ElementNotVisibleException: Message: {"errorMessage":"Element is not currently visible and may not be manipulated"

回答

0

它是一個計時問題。 save_screenshot是一個昂貴的命令,所以它延遲腳本足夠的時間讓登錄彈出窗口中的元素變得可見。

在任何命令不會執行任何操作之前設置隱式等待,implicit wait正在爲driver設置一次。這告訴driver查找存在直到駕駛員壽命的指定時間量。

爲了確保元素可見使用explicit waitexpected conditions

from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.PhantomJS() 
driver.set_window_size(1920, 1080) 
driver.get('https://soundcloud.com/') 
driver.implicitly_wait(5) 
driver.set_page_load_timeout(5) 

wait = WebDriverWait(driver, 10) 

signIn_button = wait.until(EC.visibility_of_element_located((By.XPATH, "//button[@class='g-opacity-transition frontHero__loginButton g-button-transparent-inverted sc-button sc-button-medium loginButton']"))) 
signIn_button.click() 

emailField = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@class='textfield__input sc-input sc-input-large'][@type='text']"))) 
emailField.click() 
emailField.send_keys(account.email) 
emailField.send_keys(Keys.RETURN)