51Testing软件测试论坛

标题: selenium+python无法定位网页上弹框的按钮,求指教! [打印本页]

作者: suxi    时间: 2016-9-26 15:27
标题: selenium+python无法定位网页上弹框的按钮,求指教!
网页上的弹框的按钮一直定位不到,id是动态的,通过xpath相对路径依然无法定位
作者: 若尘_51    时间: 2016-9-26 16:21
朋友,附个图吧。
作者: huzhaoqiang5566    时间: 2016-9-26 16:52
这个弹框是不是个assert呢?
作者: huzhaoqiang5566    时间: 2016-9-26 16:53
说错了。是不是alert?
作者: huzhaoqiang5566    时间: 2016-9-26 16:57
而且,最后一句好像写错了。既然你把那个元素给了sure变量。那上面那行最后面就不能在跟.click()
作者: suxi    时间: 2016-9-26 17:18
本帖最后由 suxi 于 2016-9-27 14:26 编辑
若尘_51 发表于 2016-9-26 16:21
朋友,附个图吧。

#coding=utf-8
from selenium import webdriver

import time

driver=webdriver.Firefox()
driver.get("http://www.inboundmarketing.cn")

#窗口最大化
driver.maximize_window()
#登录
driver.find_element_by_id("username").clear()
driver.find_element_by_id("username").send_keys("???")
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("???")
driver.find_element_by_id("login-btn").click()

time.sleep(2)

#跳转到:用户
driver.find_element_by_link_text("用户").click()
time.sleep(2)

#跳转到:联系人
driver.find_element_by_xpath("//div[@id='left-menu']/div[3]/a/div/div/span[2]").click()

time.sleep(2)
#跳转到联系人分组
driver.find_element_by_link_text("联系人分组").click()

time.sleep(2)
#选择
driver.find_element_by_xpath("//*[@id='group-page-list']/tbody/tr[2]/td[1]/input").click()

time.sleep(2)
driver.find_element_by_xpath("/html/body/div[2]/div[1]/div/div/div[3]/div/a").click()
#delete=driver.find_element_by_tag_name("a").find_element_by_class_name("btn btn-primary")
#delete.click()

time.sleep(5)

sure=driver.find_element_by_xpath("//div[@class_name='modal-content']/div[3]/div/div/button[2]")
sure.click()

time.sleep(3)
作者: suxi    时间: 2016-9-26 17:19
huzhaoqiang5566 发表于 2016-9-26 16:57
而且,最后一句好像写错了。既然你把那个元素给了sure变量。那上面那行最后面就不能在跟.click()

已修改,但是还是一样报错
作者: suxi    时间: 2016-9-26 17:20
huzhaoqiang5566 发表于 2016-9-26 16:53
说错了。是不是alert?

是的
作者: huzhaoqiang5566    时间: 2016-9-26 21:25
suxi 发表于 2016-9-26 17:20
是的

是alert的话,要先接受这个警告。再做处理的。
a=driver.switch_to_alert()
a.accept()

作者: 掉渣饼    时间: 2016-9-27 09:45
可以参考下面的代码:
#获得当前窗口
nowhandle=driver.current_window_handle
#打开弹窗
driver.find_element_by_name("页面上的删除元素id或者name").click()
#获得所有窗口
allhandles=driver.window_handles
for handle in allhandles:
    #比较当前窗口是不是原先的窗口
    if handle!=nowhandle:
        #获得当前窗口的句柄
        driver.switch_to_window(handle)
        #在当前窗口操作
        dirver.find_element_by_class_name("删除元素class的值").click()
#回到原先的窗口
driver.switch_to_window(nowhandle)
作者: suxi    时间: 2016-9-27 10:16
huzhaoqiang5566 发表于 2016-9-26 21:25
是alert的话,要先接受这个警告。再做处理的。
a=driver.switch_to_alert()
a.accept()

alert是不是不可以使用F12中的箭头去获取元素?
我将脚本修改成alert的形式,但是报错
    raise exception_class(message, screen, stacktrace)
NoAlertPresentException: Message: No alert is present
是不是说说明这个并不是alert?
但问了开发,开发说是alert,只是封装起来了
作者: 若尘_51    时间: 2016-9-27 11:20
本帖最后由 若尘_51 于 2016-9-27 13:54 编辑
suxi 发表于 2016-9-26 17:18
#coding=utf-8
from selenium import webdriver

是你写的脚本有错,我用你的脚本跑了一遍,修改后就可以跑通了(不好意思删除你的一条记录,另外提醒下记得修改下密码,以免别用用心的人利用了):
time.sleep(5)
sure=driver.find_element_by_xpath("//div[@class_name='modal-content']/div[3]/div/div/button[2]")
sure.click()
time.sleep(3)

修改成:
time.sleep(3)
driver.find_element_by_xpath("//*[@class='modal-content']/div[3]/div/div/button[2]").click()
time.sleep(3)
作者: suxi    时间: 2016-9-27 14:19
若尘_51 发表于 2016-9-27 11:20
是你写的脚本有错,我用你的脚本跑了一遍,修改后就可以跑通了(不好意思删除你的一条记录,另外提醒下记 ...

问题已解决,非常感谢,也非常感谢提醒!
作者: SunnyLan    时间: 2016-9-27 14:40
是不是没有加等待时间?
作者: 芒果go    时间: 2016-10-8 15:10
suxi 发表于 2016-9-27 10:16
alert是不是不可以使用F12中的箭头去获取元素?
我将脚本修改成alert的形式,但是报错
    raise excep ...

用楼上所说的方法,获取当前窗口,再用for循环,我之前遇到过,封装的alert不能用alert的accept,用句柄应该可以,你试试。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2