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
。但是,当删除此代码时,程序无法尝试操作此文本字段并抛出错误:
selenium.common.exceptions.ElementNotVisibleException:消息: {" errorMessage":"元素当前不可见,可能不是 操纵"
答案 0 :(得分:0)
这是一个时间问题。 save_screenshot
是一个昂贵的命令,因此它会延迟脚本足够的时间使登录弹出窗口中的元素变得可见。
在任何命令执行任何操作之前设置隐式等待,implicit wait
被设置为driver
一次。这告诉driver
寻找存在直到指定的驱动器寿命时间。
要确保元素可见,请使用explicit wait
expected 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)