我想使用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)
我不知道怎么去弹出窗口并在那里找到元素。
如何在弹出窗口中登录此网站。
答案 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的结果。