-
2021-03-17 02:17:10
我也是刚学自动化,在自学过程中发现浏览器中有一些弹窗元素,无法定位。经过自己的摸索,有一些心得,写下来供日后自己回顾。
首先要确定弹窗的类型:
(1)div弹窗
(2)新标签页弹窗
(3)alert弹窗
一,div弹窗
div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样。不过这里会有一个坑,明明可以找到这个按钮,但是就是定位不到。这个就是因为当前有div弹窗弹出的时候,需要设置一下等待时间,等页面元素加载完毕,再去做其他操作。
这里用百度登陆为例子:
from selenium import webdriver
import time
def login_baidu(url,username,password):
driver.get(url)
driver.find_element_by_xpath('//*[@id="u1"]/a[7]').click()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]').click()
time.sleep(2) # 弹窗出现后,使页面等待2S
login_username = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]')
login_username.click()
login_username.send_keys(username)
login_passwork = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]')
login_passwork.click()
login_passwork.send_keys(password)
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]').click() # 登陆按钮
if __name__ == "__main__":
driver = webdriver.Firefox()
username = r'xxx@qq.com'
password = r'xxxx'
url = r'https://www.baidu.com'
login_baidu(url,username,password)
二,新标签页弹窗
新标签页弹窗,则需要进行窗口的切换。此处第一个窗口打开百度首页,在打开一个新窗口打开京东首页,在两个窗口之间进行切换。切换到不同的窗口之后,就可以用常规的方法进行元素的定位。
from selenium import webdriver
import time
def open_window1():
driver.get("https://www.baidu.com")
time.sleep(2)
def open_window2(): # 用JS的方法打开新窗口,模拟新标签页弹窗
js = "window.open('https://www.jd.com')"
driver.execute_script(js)
time.sleep(2)
def Switch_Window():
handles = driver.window_handles
print("打印当前已打开的窗口:"+str(handles))
while(1): # 在两个窗口之间做切换动作
driver.switch_to.window(handles[0])
time.sleep(5)
driver.switch_to.window(handles[1])
time.sleep(5)
if __name__ == "__main__" :
driver = webdriver.Firefox()
open_window1()
open_window2()
Switch_Window()
handles = driver.window_handles # 获取当前打开的所有窗口的句柄
driver.switch_to.window(handles[N]) # 切换到其中一个窗口
其中,获取的句柄下标从0开始,即第一个窗口为[0]、第二个窗口为[1],如此类推。使用switch_to.window方法切换到新标签页后就可以做其他操作了。
---------------------
作者:他们叫我岛主
来源:CSDN
原文:https://blog.csdn.net/qq_35519464/article/details/82505541
版权声明:本文为博主原创文章,转载请附上博文链接!
更多相关内容 -
51job+selenium+div弹窗
2021-07-07 17:53:16from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from...一、弹窗问题
参照 转载:
https://www.jianshu.com/p/4c3330c1cdb5
如图所示,div弹窗
二、弹窗内容
首先要确定弹窗的类型:(1)div弹窗
(2)新标签页弹窗
(3)alert弹窗
一,div弹窗
div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样。不过这里会有一个坑,明明可以找到这个按钮,但是就是定位不到。这个就是因为当前有div弹窗弹出的时候,需要设置一下等待时间,等页面元素加载完毕,再去做其他操作。
这里用百度登陆为例子:
二,新标签页弹窗新标签页弹窗,则需要进行窗口的切换。此处第一个窗口打开百度首页,在打开一个新窗口打开京东首页,在两个窗口之间进行切换。切换到不同的窗口之后,就可以用常规的方法进行元素的定位。
handles = driver.window_handles # 获取当前打开的所有窗口的句柄driver.switch_to.window(handles[N]) # 切换到其中一个窗口
其中,获取的句柄下标从0开始,即第一个窗口为[0]、第二个窗口为[1],如此类推。使用switch_to.window方法切换到新标签页后就可以做其他操作了。
三、alert弹窗
在WebDriver中处理JS所生成的alert、confirm以及prompt十分简单,具体做法是使用switch_to.alert()方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/send_keys等方法进行操作。
1.text:返回alert/confirm/prompt中的文字信息。
2.accept():接受现有警告框。
3.dismiss():解散现有警告框。
4.send_keys(keysToSend):发送文本至警告框。 keysToSend:将文本发送至警告框。
如图所示,百度搜索设置弹出的窗口是不能通过前端工具对其进行定位的,这个时候就可以通过switch_to.alert()方法接受这个弹窗。
代码如下:
三、爬取51job 职位关键词搜索的完整代码from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time import json import csv import random # 声明一个谷歌驱动器,并设置不加载图片,间接加快访问速度 options = webdriver.ChromeOptions() options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2}) browser = webdriver.Chrome(options=options) #窗口最大化 browser.maximize_window() #隐式等待 wait = browser.implicitly_wait(10) #显示等待 wait =WebDriverWait(browser, 10) # url url = 'https://www.51job.com/' keyword = input('请输入职位:').strip()#比如ipad # 声明一个list,存储dict data_list = [] def start_spider(): # 请求url browser.get(url) # 获取输入框的id,并输入关键字python爬虫 zhiwei_base = browser.find_elements_by_css_selector('.nlink a') # print(type(zhiwei_base)) # print(len(zhiwei_base)) zhiwei_base[1].click() browser.find_element_by_id('keywordInput').send_keys(keyword) browser.find_element_by_id('search_btn').click() #定位浏览器弹窗元素------div弹窗 #操作:明明可以找到这个按钮,但是就是定位不到。这个就是因为当前有div弹窗弹出的时候,需要设置一下等待时间,等页面元素加载完毕,再去做其他操作。 time.sleep(5) browser.find_element_by_class_name('allcity').click() browser.find_element_by_class_name('ttag').click() time.sleep(5) browser.find_element_by_class_name('but_box').find_element_by_class_name('p_but').click() time.sleep(5) print('_________________________________________________________________________') # 显示等待下一页的元素加载完成 wait.until( EC.presence_of_all_elements_located( (By.CLASS_NAME, 'next') ) ) # 将滚动条拉到最下面的位置,因为往下拉才能将这一页的商品信息全部加载出来 browser.execute_script('document.documentElement.scrollTop=10000') # 随机延迟,等下元素全部刷新 time.sleep(random.randint(1, 3)) browser.execute_script('document.documentElement.scrollTop=0') # 先获取一个有多少页 page = browser.find_elements_by_css_selector('.p_in span') all_page = eval(page[0].text[2:4].strip()) print(all_page) # 设置一个计数器 count = 0 # 无限循环 while True: try: count += 1 # 显示等待商品信息加载完成 '''wait.until( EC.presence_of_all_elements_located( (By.CLASS_NAME, '.j_joblist') ) ) ''' # 将滚动条拉到最下面的位置,因为往下拉才能将这一页的商品信息全部加载出来 browser.execute_script('document.documentElement.scrollTop=10000') # 随机延迟,等下元素全部刷新 time.sleep(random.randint(1, 3)) browser.execute_script('document.documentElement.scrollTop=0') print('###########################################################33') lis = browser.find_elements_by_css_selector('.j_joblist') # print(type(lis)) # print(len(lis)) lis_list = lis[0].find_elements_by_class_name('e') # print(type(lis_list)) # print(len(lis_list)) for li in lis_list: post = li.find_element_by_class_name('jname').text print(post) post_link = li.find_element_by_class_name('el').get_attribute('href') print(post_link) data_issue = li.find_element_by_class_name('time').text print(data_issue) salary = li.find_element_by_class_name('sal').text print(salary) extra = li.find_element_by_class_name('d').text print(extra) try: tags = li.find_element_by_class_name('tags').get_attribute('title') print(tags) except: tags = None print(tags) cname = li.find_element_by_class_name('cname').text print(cname) clink = li.find_element_by_class_name('cname').get_attribute('href') print(clink) ctpye = li.find_element_by_class_name('dc').text print(ctpye) cint = li.find_element_by_class_name('int').text print(cint) # 声明一个字典存储数据 data_dict = {} data_dict['post'] = post data_dict['post_link'] = post_link data_dict['data_issue'] = data_issue data_dict['salary'] = salary data_dict['extra'] = extra data_dict['tags'] = tags data_dict['cname'] = cname data_dict['clink'] = clink data_dict['ctpye'] = ctpye data_dict['cint'] = cint data_list.append(data_dict) print(data_dict) except Exception as e: continue # 如果count==all_page就退出循环 if count == 2: break # 找到下一页的元素pn-next #fp_page = browser.find_elements_by_css_selector('.p_in li') fp_next = browser.find_element_by_class_name('next') # 点击下一页 fp_next.click() def main(): start_spider() # 将数据写入jsonwenj with open('data_json.json', 'a+', encoding='utf-8') as f: json.dump(data_list, f, ensure_ascii=False, indent=4) print('json文件写入完成') with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f: # 表头 title = data_list[0].keys() # 声明writer writer = csv.DictWriter(f, title) # 写入表头 writer.writeheader() # 批量写入数据 writer.writerows(data_list) print('csv文件写入完成') if __name__ == '__main__': main() # 退出浏览器 browser.quit()
-
Selenium之如何定位隐藏div弹窗
2018-12-11 16:41:45一、判断是否为隐藏属性 display的值为none则为隐藏...js = 'document.querySelectorAll("#agentId > div > div > i")[0].style.display="block";' driver.execute_script(js) 部分知识参考自虫师及菜鸟教程一、判断是否为隐藏属性
display的值为none则为隐藏(详见下图红色标记)
二、将隐藏属性修改为非隐藏属性
知识储备:
1.document对象:
(1)当浏览器载入HTML文档时,便会成为document对象
(2)document对象可对HTML界面的所有元素进行访问
2.document.querySelectAll()方法
HTML5中引入的新方法,返回匹配的CSS选择器的所有元素节点列表
3.[0]是指这一组元素的第几个元素
4.style.display="block"将none修改为block
js = 'document.querySelectorAll("#agentId > div > div > i")[0].style.display="block";' driver.execute_script(js)
部分知识参考自虫师及菜鸟教程
-
Selenium之定位浏览器弹窗方法汇总
2020-12-13 11:42:23在selenium自动化测试过程中会遇到定位浏览器弹窗的情况,根据弹框实现原理的不同大致可以分为以下几种类型。 1.alert、confirm、prompt类型弹框 这三种弹框是JavaScript核心对象window对象中的三种方法。 1.1 ...目录
在Selenium自动化测试过程中会遇到定位浏览器弹窗的情况,根据弹窗实现原理不同大致可分为以下几种定位方式。
1. alert、confirm、prompt类型弹框
这三种弹框是JavaScript核心对象window对象中的三种方法。
1.1 alert弹框
警告消息框 alert 方法有一个参数,即希望对用户显示的文本字符串。该字符串不是 HTML 格式。该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说,用户必须先关闭该消息框然后才能继续进行操作。
selenium处理alert() 提示框:
- driver.switchTo().alert(); 获取alert
- alert.accept(); 点确定
- alert.dismiss(); 点取消
- alert.getText();获取alert的内容
alert弹框定位代码:
try{ Alert alert =driver.switchTo().alert(); //使用driver.switchTo().alert()方法获取到alert对象 Assert.assertEquals("弹框实际文本", alert.getText()); //断言弹框文本是否和预期一致 alert.accept(); //点击确定 // alert.dismiss(); //点击取消 }catch(NoAlertPresentException exception){ //弹框未显示,则跑出异常 Assert.fail("尝试操作的alert框没有被找到"); exception.printStackTrace(); }
# Click the link to activate the alert driver.find_element(By.LINK_TEXT, "See an example alert").click() # Wait for the alert to be displayed and store it in a variable alert = wait.until(expected_conditions.alert_is_present()) # Store the alert text in a variable text = alert.text # Press the OK button alert.accept()
1.2 confirm弹框
确认消息框 使用确认消息框可向用户问一个“是-或-否”问题,并且用户可以选择单击“确定”按钮或者单击“取消”按钮。confirm 方法的返回值为 true 或 false。该消息框也是模式对话框:用户必须在响应该对话框(单击一个按钮)将其关闭后,才能进行下一步操作。
selenium处理confirm() 提示框:
同alert一致
try{ Alert alert =driver.switchTo().alert(); Assert.assertEquals("弹框实际文本", alert.getText()); alert.accept(); // alert.dismiss(); }catch(NoAlertPresentException exception){ Assert.fail("尝试操作的alert框没有被找到"); exception.printStackTrace(); }
# Click the link to activate the alert driver.find_element(By.LINK_TEXT, "See a sample confirm").click() # Wait for the alert to be displayed wait.until(expected_conditions.alert_is_present()) # Store the alert in a variable for reuse alert = driver.switch_to.alert # Store the alert text in a variable text = alert.text # Press the Cancel button alert.dismiss()
1.3 prompt弹框
提示消息框 提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个“确定”按钮和一个“取消”按钮。如果您提供了一个辅助字符串参数,则提示消息框将在文本字段显示该辅助字符串作为默认响应。否则,默认文本为 "<undefined>"。
selenium处理prompt() 提示框:
try{ Alert alert =driver.switchTo().alert(); Assert.assertEquals("弹框实际文本", alert.getText()); alert.sendKeys("promt框中输入的内容"); alert.accept(); // alert.dismiss(); }catch(NoAlertPresentException exception){ Assert.fail("尝试操作的alert框没有被找到"); exception.printStackTrace(); }
# Click the link to activate the alert driver.find_element(By.LINK_TEXT, "See a sample prompt").click() # Wait for the alert to be displayed wait.until(expected_conditions.alert_is_present()) # Store the alert in a variable for reuse alert = Alert(driver) # Type your message alert.send_keys("Selenium") # Press the OK button alert.accept()
2. div弹框
div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样。不过这里会有一个坑,明明可以找到这个按钮,但是就是定位不到。这个就是因为当前有div弹窗弹出的时候,需要设置一下等待时间,等页面元素加载完毕,再去做其他操作。这里用百度登陆为例子:
3. 新标签页弹窗
新标签页弹窗,则需要进行窗口的切换。
弹出内容是嵌入的窗口解决思路:
# 打印所有的handle
all_handles = driver.window_handles
print(all_handles)
# 切换到新的handle上
driver.switch_to.window(all_handles[N])
其中,获取的句柄下标从0开始,即第一个窗口为[0]、第二个窗口为[1],如此类推。使用switch_to.window方法切换到新标签页后就可以做其他操作了。
此处第一个窗口打开百度首页,在打开一个新窗口打开京东首页,在两个窗口之间进行切换。切换到不同的窗口之后,就可以用常规的方法进行元素的定位。
4. 弹出框是iframe
driver.switch_to.frame("frame1")之后进行定位元素
具体定位方式查看我的另一篇博客:Selenium之定位及切换frame(iframe)
参考文章:
1.关于Python+selenium 定位浏览器弹窗元素 - 简书
2.selenium定位弹框元素 - (●—●)大白 - 博客园
-
selenium定位弹窗的方法
2020-09-04 17:40:231、弹出框是div层,跟平常一样定位,不用管弹出框 #点击退出按钮 FindElement(self.brower,"classname","btn-exit").click() #time.sleep(3) #点击确认按钮(直接定位元素不用管页面的弹出样式,driver.window_... -
Python+selenium自动化之30----EC模块之div弹窗
2020-07-06 16:17:19Python+selenium自动化之30----EC模块之div弹窗 弹窗有div、alert、confirm、prompt等几类,div弹窗其实和普通元素没有区别, div弹框是否被隐藏,一般情况下可以获取div弹框属性都会有style="display: none;",... -
selenium中,div弹出提示框,如何定位?
2020-05-20 11:15:44弹出框是用div模拟出来的,用switch_to_window和switch_to_frame是切换不过去的,那么如何去定位到弹框呢? 可以这样处理: 一般弹出窗口那个mainFrame是同一层窗口,同时mianframe在顶层窗口下面,所以这里我通... -
Selenium:弹窗处理
2022-03-04 16:23:30HTML中的弹窗 1、在实际系统中,在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框 2、警告消息框:alert ⑴警告消息框提供了一个"确定"按钮让用户关闭... -
Selenium自动化测试如何判断是否发生div弹窗
2019-08-07 10:16:06如题:有时候做完操作后会有一些弹窗,但这些弹窗并不是alert弹窗,而是div弹窗,请问怎么判断是否出现弹窗? 备注:这些弹窗没有固定的id,class,没有固定的xpath,整个页面都是动态的 另一个问题,这个问题也许是... -
Python+selenium自动化之EC模块之div弹窗
2020-11-24 00:35:17原标题:Python+selenium自动化之EC模块之div弹窗弹窗有div、alert、confirm、prompt等几类,div弹窗其实和普通元素没有区别, div弹框是否被隐藏,一般情况下可以获取div弹框属性都会有style="display: none;... -
Python+Selenium自动化测试如何判断是否发生div弹窗
2019-07-29 19:23:02如题:有时候做完操作后会有一些弹窗,但这些弹窗并不是alert弹窗,而是div弹窗,请问怎么判断是否出现弹窗? 备注:这些弹窗没有固定的id,class,没有固定的xpath,整个页面都是动态的 另一个问题,这个问题也许是... -
Selenium自动化之弹窗处理
2022-04-22 18:57:21我们在使用Selenium做Web自动化测试时,页面经常出现弹窗,如果不处理后续的测试脚本就无法正常运行,今天我们就带大家一起来学习如何处理Web页面上的弹窗。 2.Web页面弹窗的分类 弹窗通常有3种:Alert类型弹框、... -
DIV弹出层+定位
2013-12-24 09:59:21这个例子是,div弹出层并且固定位置,弹出层的弹出方式为滑动方式。 -
selenium定位弹框元素
2020-07-14 17:34:04selenium定位弹窗元素 一、 弹出框是alert类型: selenium提供switch_to_alert方法:捕获弹出对话框(可以定位alert、confirm、prompt对话框) alert=switch_to_aler; alter.text 查看alter的文案 确认alter... -
java+selenium如何定位一闪而退的弹窗且获取该弹窗的文本
2020-03-03 22:06:40java+selenium如何定位一闪而退的弹窗且获取该弹窗的文本 获取页面弹窗,首先要定位到相对应的元素,常见的是alert弹窗,这种是相对简单的,切换到alert,并且返回当前打开的alert对象,使用switch_to.alert()方法... -
解决selenium授权auth弹窗登录问题
2019-12-25 17:05:18背景:模拟弹窗类型授权网站登录,然后输入关键词进行查询的交互操作 如图: 原因: 弹窗不方便确认element代码元素位置,难以获取相关元素进行操作。 解决办法01 核心代码: browser.get(... -
selenium定位div弹出层时间插件
2017-04-20 01:20:05对xpath获得的绝对路径不能定位 要获取图中时间插件中的“取消”按钮就成  调用时间插件的位置 ![图片说明]... -
python Selenium初学记录 弹窗处理 no such alert
2022-02-02 19:40:25但是我后续想要提取领完奖励后弹窗的文本,直接浏览器里复制xpath,提取不出来。 //*[@id="showAlertContent"] 我就以为是遇到了类似iframe的情况,需要先特殊处理,搜索了一下,发现了关于alert的处理 ... -
selenium:定位一闪而过的弹窗
2022-03-25 16:33:11selenium:定位一闪而过的弹窗 测试TP商城的时候,遇到了一闪而过的弹窗,右击检查很难捕获,看了代码,是JS写的函数判断,alert弹出信息。 然后就陷入了无限的搜索alert弹窗定位的循环中,最终没有实现定位。 这里... -
python+selenium如何定位iframe下面div双层弹窗里面的元素
2021-09-23 18:00:39我能定位到弹窗上面的“确定和取消”按钮,就是定位不到里面的“四川省”,请各位帮忙指点指点。 -
selenium 获取div标签的文本
2019-11-29 15:01:35当我们使用selenium获取div标签下的文本时, 应该使用 div = browser.find_element_by_xpath('你的div path') text = div.get_attribute('innerText') text即为div下的文本