在Selenium中,如何使用python在弹出窗口中登录网站?

时间:2017-07-09 06:14:08

标签: python selenium

我想使用selenium登录网站。 此网站有链接(成员登录),当我点击此链接时,会出现弹出窗口。

网站网址为http://affiliates.888.com/

我编写的代码如下。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

eight88 = webdriver.Chrome()
eight88.get("http://affiliates.888.com/")
assert "Earn Real Money" in eight88.title
loginForm = eight88.find_element_by_class_name("hide-under-480").click()
# so far popup appears.
eight88.switch_to_alert()
eight88.find_element_by_id("userName").send_keys("username")
eight88.find_element_by_id("password").send_keys("password")

当我运行此脚本时,NoSuchElementException发生。

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"userName"}
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.4.0-83-generic x86_64)

我不知道怎么去弹出窗口并在那里找到元素。

如何在弹出窗口中登录此网站。

2 个答案:

答案 0 :(得分:3)

授权表单位于iframe内,而非警报。为了能够处理iframe内的元素,您应该首先切换到它:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait

eight88 = webdriver.Chrome()
eight88.get("http://affiliates.888.com/")
assert "Earn Real Money" in eight88.title
loginForm = eight88.find_element_by_class_name("hide-under-480")
loginForm.click()

wait(eight88, 10).until(EC.frame_to_be_available_and_switch_to_it(eight.find_element_by_xpath('//iframe[contains(@src, "Auth/Login")]')))

eight88.find_element_by_id("userName").send_keys("username")
eight88.find_element_by_id("password").send_keys("password")

答案 1 :(得分:0)

弹出窗口是由JavaScript生成的。所以这是一个动态页面。当您使用driver.get()时,您正在阅读生成的第一个静态页面源,显然不包括用户名和密码字段。首先弄清楚JavaScript如何调用弹出窗口,然后使用selenium的exec函数执行该JavaScript,另一个用于验证第一个JavaScript的结果。