• 关于Python+selenium 定位浏览器弹窗元素


    首先要确定弹窗的类型:

    (1)div弹窗

    (2)新标签页弹窗

    (3)alert弹窗

    一,div弹窗
    div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样。不过这里会有一个坑,明明可以找到这个按钮,但是就是定位不到。这个就是因为当前有div弹窗弹出的时候,需要设置一下等待时间,等页面元素加载完毕,再去做其他操作。
    这里用百度登陆为例子:

     1 from selenium import webdriver
     2 import time
     3 
     4 def login_baidu(url,username,password):
     5     driver.get(url)
     6     driver.find_element_by_xpath('//*[@id="u1"]/a[7]').click()
     7     time.sleep(2)
     8     driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]').click()
     9     time.sleep(2) # 弹窗出现后,使页面等待2S
    10 
    11     login_username = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]')
    12     login_username.click()
    13     login_username.send_keys(username)
    14 
    15     login_passwork = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]')
    16     login_passwork.click()
    17     login_passwork.send_keys(password)
    18 
    19     driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]').click() # 登陆按钮
    20 
    21 if __name__ == "__main__":
    22     driver = webdriver.Firefox()
    23     username = r'xxx@qq.com'
    24     password = r'xxxx'
    25     url = r'https://www.baidu.com'
    26     login_baidu(url,username,password)

    二,新标签页弹窗
    新标签页弹窗,则需要进行窗口的切换。此处第一个窗口打开百度首页,在打开一个新窗口打开京东首页,在两个窗口之间进行切换。切换到不同的窗口之后,就可以用常规的方法进行元素的定位。

     1 from selenium import webdriver
     2 import time
     3 
     4 def open_window1():
     5    driver.get("https://www.baidu.com")
     6    time.sleep(2)
     7 
     8 def open_window2(): # 用JS的方法打开新窗口,模拟新标签页弹窗
     9     js = "window.open('https://www.jd.com')"
    10     driver.execute_script(js)
    11     time.sleep(2)
    12 
    13 def Switch_Window():
    14     handles = driver.window_handles
    15     print("打印当前已打开的窗口:"+str(handles))
    16     while(1): # 在两个窗口之间做切换动作
    17         driver.switch_to.window(handles[0])
    18         time.sleep(5)
    19         driver.switch_to.window(handles[1])
    20         time.sleep(5)
    21 
    22 if __name__ == "__main__" :
    23     driver = webdriver.Firefox()
    24     open_window1()
    25     open_window2()
    26     Switch_Window()

    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()方法接受这个弹窗。

    代码如下:

     1 #导包
     2 from selenium import webdriver
     3 from selenium.webdriver.common.action_chains import ActionChains
     4 from time import sleep
     5 #定义浏览器句柄,打开百度网页
     6 driver=webdriver.Chrome()
     7 driver.implicitly_wait(10)
     8 url="http://www.baidu.com"
     9 driver.get(url)
    10 #鼠标悬停至"设置"连接
    11 link=driver.find_element_by_link_text('设置')
    12 ActionChains(driver).move_to_element(link).perform()
    13 #打开搜索设置
    14 driver.find_element_by_link_text('搜索设置').click()
    15 #保存设置
    16 sleep(2)
    17 driver.find_element_by_xpath('//*[@id="gxszButton"]/a[1]').click()
    18 sleep(3)19 #接受警告框
    20 alert=driver.switch_to.alert
    21 print(alert.text)
    22 alert.accept()
    23 #20和22行合并,可以直接写成: driver.switch_to.alert.accept()
    24 sleep(2)
    25 driver.quit()

    ------------------------------------------------------------------------------------------------

    talk is cheap,show me the code.

  • 相关阅读:
    PHP图像处理
    PHP文件上传
    PHP文件编程
    PHP面向对象
    【Codeforces Round #694 (Div. 1) B】Strange Definition
    【Codeforces Round #694 (Div. 2) C】Strange Birthday Party
    【Codeforces Round #693 (Div. 3) F】New Year's Puzzle
    【Codeforces Round #693 (Div. 3) G】Moving to the Capital
    【Codeforces Round #695 (Div. 2) E】Distinctive Roots in a Tree
    【Codeforces Round #695 (Div. 2) D】Sum of Paths
  • 原文地址:https://www.cnblogs.com/chenshengkai/p/11303495.html
Copyright © 2020-2023  润新知