在ssh服务器上使用Python的Selenium:InvalidElementStateException& ElementNotVisibleException

时间:2017-06-26 11:23:48

标签: python selenium ssh quora

我试图登录 Quora 网站。  在我的本地机器上运行完美。

但是在SSH服务器上(DigitalOcean上的Droplet) - 不,我得到了InvalidElementStateException

我试图通过send_keys(Keys.NULL)关注元素,得到ElementNotVisibleException

以下是代码:

driver.get("https://www.quora.com/")
print("Logging...")

# gets email and password from json
with open('config.json') as f:
    login_data = json.load(f)
email = login_data['email']
password = login_data['pass']
time.sleep(3)
email_field_xpath = "//div[@class='form_column']/input[@name='email']"
password_field_xpath = "//div[@class='form_column']/input[@name='password']"

# webdriver's going to wait max 10 seconds for email's field, password field, login button to display
email_field_element = WebDriverWait(driver, 10).until(
    lambda driver: driver.find_element_by_xpath(email_field_xpath))
password_field_element = WebDriverWait(driver, 10).until(
    lambda driver: driver.find_element_by_xpath(password_field_xpath))

email_field_element.send_keys(Keys.NULL)
email_field_element.clear()
email_field_element.send_keys(email)
password_field_element.send_keys(Keys.NULL)
password_field_element.clear()
password_field_element.send_keys(password)
login_button_xpath = "//input[@value='Login']"
# wait till element is clickable
login_button_element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, login_button_xpath)))
login_button_element.click()
print("Logged In.")

1 个答案:

答案 0 :(得分:0)

您在本地计算机和SSH服务器上使用的屏幕分辨率可能不同。可能是本地和SSH服务器上打开的浏览器窗口的大小都不同。

尝试将本地设置更改为SSH服务器,而不是找出实际原因或尝试下面给出的可能解决方案。

首先关注元素的可能解决方案。在这里,您的element可以是email_field_elementpassword_field_element

1)首先使用ActionChains移动到该元素:

from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
actions.move_to_element(element)
actions.perform()

2)您也可以使用向上滚动到该元素。像:

driver.execute_script("arguments[0].scrollIntoView(true);", element)

3)使用java脚本输入数据。

driver.execute_script("document.getElementById('elementID').setAttribute('value', 'new value for element')" # you can use xpath as well

希望它可以帮到你。