想用 selenium 登陆网站,但是无法获取弹出的验证码 frame 的名称,无法切换 frame 无法控制

2016-10-24 22:04:28 +08:00
 bbxiong

http://wuxia.qq.com/cp/a20160920tmfl/ 天涯明月刀的网站,想自动领取奖励,登陆这块就遇到问题

打开网站后,点击登陆,切换到 loginIframe 登陆 frame 输入用户名密码正确,但是登陆后无法控制验证码所在的 frame ,看不出名字,没法切换也就无法控制

代码如下:

tyurl = "http://wuxia.qq.com/cp/a20160920tmfl/"

username = "123456"
pwd  = "1234561"

binary = FirefoxBinary("z:\\firefox\\firefox.exe")

driver = webdriver.Firefox(firefox_binary=binary,executable_path = "z:\geckodrive\geckodriver.exe")

driver.get(tyurl)


driver.find_element_by_id("dologin").click()
driver.switch_to_frame("loginIframe")

# 等待账号密码登录窗口出现,点击账号密码登
WebDriverWait(driver, 10,1).until(EC.presence_of_element_located((By.ID,"switcher_plogin")))
driver.find_element_by_id("switcher_plogin").click()

# 输入账号密码
WebDriverWait(driver, 30,1).until(EC.presence_of_element_located((By.ID,"login_button")))

for i in range(1,20):
	try:
		driver.find_element_by_id("u").click()
		driver.find_element_by_id("u").send_keys(username)
		driver.find_element_by_id("p").click()
		driver.find_element_by_id("p").send_keys(pwd)
		break
	except Exception, e:
		pass


# 输入密码点击确定后无法定位验证码窗口
try:
	WebDriverWait(driver, 5,1).until(EC.presence_of_element_located((By.ID,"capImg")))
except Exception, e:
	pass


# 找不到当前验证码窗口里的 ID capImg
print(driver.find_element_by_id("capImg").src)
2692 次点击
所在节点    Python
7 条回复
xrlin
2016-10-24 23:42:28 +08:00
试一下使用 driver.switch_to_default_content(), 我当初是这么解决类似问题的。
bbxiong
2016-10-25 00:14:20 +08:00
driver.switch_to_default_content() 试验过了,不行,也是报错.
SlipStupig
2016-10-25 00:22:27 +08:00
driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
bbxiong
2016-10-25 10:51:14 +08:00
driver.switch_to_frame(driver.find_element_by_css_selector("iframe[title='Fill Quote']"));
这个也不行:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: iframe[title='Fill Quote']
kittyyc713
2016-10-26 10:05:01 +08:00
我比较好奇你怎么破验证码。。人工吗
bbxiong
2016-10-26 10:48:58 +08:00
正确方法, switch_to_frame 支持对象参数,传递当前页面的 iframe 就可以额

driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])

记得还要调出来

driver.switch_to.default_content()
bbxiong
2016-10-26 10:49:51 +08:00
验证码用各种答题服务器平台就可以。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/315140

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX