精华内容
下载资源
问答
  • 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:16
    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...

    一、弹窗问题
    参照 转载:
    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 ...

    目录

    1. alert、confirm、prompt类型弹框

    1.1 alert弹框

    1.2 confirm弹框

    1.3 prompt弹框

    2. div弹框

    3. 新标签页弹窗

    4. 弹出框是iframe


    在Selenium自动化测试过程中会遇到定位浏览器弹窗的情况,根据弹窗实现原理不同大致可分为以下几种定位方式。

    1. alert、confirm、prompt类型弹框

    这三种弹框是JavaScript核心对象window对象中的三种方法。

    1.1 alert弹框

    警告消息框 alert 方法有一个参数,即希望对用户显示的文本字符串。该字符串不是 HTML 格式。该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说,用户必须先关闭该消息框然后才能继续进行操作。

    selenium处理alert() 提示框:

    1. driver.switchTo().alert(); 获取alert
    2. alert.accept(); 点确定
    3. alert.dismiss(); 点取消
    4. 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定位弹框元素 - (●—●)大白 - 博客园

    3.https://www.jb51.net/article/156978.htm

    4.selenium多个浏览器窗口_切换 - 共感的艺术 - 博客园

    展开全文
  • selenium定位弹窗的方法

    千次阅读 2020-09-04 17:40:23
    1、弹出框是div层,跟平常一样定位,不用管弹出框 #点击退出按钮 FindElement(self.brower,"classname","btn-exit").click() #time.sleep(3) #点击确认按钮(直接定位元素不用管页面的弹出样式,driver.window_...
  • Python+selenium自动化之30----EC模块之div弹窗 弹窗有div、alert、confirm、prompt等几类,div弹窗其实和普通元素没有区别, div弹框是否被隐藏,一般情况下可以获取div弹框属性都会有style="display: none;",...
  • 弹出框是用div模拟出来的,用switch_to_window和switch_to_frame是切换不过去的,那么如何去定位到弹框呢? 可以这样处理: 一般弹出窗口那个mainFrame是同一层窗口,同时mianframe在顶层窗口下面,所以这里我通...
  • Selenium弹窗处理

    千次阅读 2022-03-04 16:23:30
    HTML中的弹窗 1、在实际系统中,在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框 2、警告消息框:alert  ⑴警告消息框提供了一个"确定"按钮让用户关闭...
  • 如题:有时候做完操作后会有一些弹窗,但这些弹窗并不是alert弹窗,而是div弹窗,请问怎么判断是否出现弹窗? 备注:这些弹窗没有固定的id,class,没有固定的xpath,整个页面都是动态的 另一个问题,这个问题也许是...
  • 原标题:Python+selenium自动化之EC模块之div弹窗弹窗有div、alert、confirm、prompt等几类,div弹窗其实和普通元素没有区别, div弹框是否被隐藏,一般情况下可以获取div弹框属性都会有style="display: none;...
  • 如题:有时候做完操作后会有一些弹窗,但这些弹窗并不是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:04
    selenium定位弹窗元素 一、 弹出框是alert类型: selenium提供switch_to_alert方法:捕获弹出对话框(可以定位alert、confirm、prompt对话框) alert=switch_to_aler; alter.text 查看alter的文案 确认alter...
  • java+selenium如何定位一闪而退的弹窗且获取该弹窗的文本 获取页面弹窗,首先要定位到相对应的元素,常见的是alert弹窗,这种是相对简单的,切换到alert,并且返回当前打开的alert对象,使用switch_to.alert()方法...
  • 解决selenium授权auth弹窗登录问题

    千次阅读 2019-12-25 17:05:18
    背景:模拟弹窗类型授权网站登录,然后输入关键词进行查询的交互操作 如图: 原因: 弹窗不方便确认element代码元素位置,难以获取相关元素进行操作。 解决办法01 核心代码: browser.get(...
  • 对xpath获得的绝对路径不能定位 要获取图中时间插件中的“取消”按钮就成 ![图片说明](https://img-ask.csdn.net/upload/201704/20/1492651306_46111.jpg) 调用时间插件的位置 ![图片说明]...
  • 但是我后续想要提取领完奖励后弹窗的文本,直接浏览器里复制xpath,提取不出来。 //*[@id="showAlertContent"] 我就以为是遇到了类似iframe的情况,需要先特殊处理,搜索了一下,发现了关于alert的处理 ...
  • selenium定位一闪而过的弹窗

    千次阅读 2022-03-25 16:33:11
    selenium定位一闪而过的弹窗 测试TP商城的时候,遇到了一闪而过的弹窗,右击检查很难捕获,看了代码,是JS写的函数判断,alert弹出信息。 然后就陷入了无限的搜索alert弹窗定位的循环中,最终没有实现定位。 这里...
  • 我能定位弹窗上面的“确定和取消”按钮,就是定位不到里面的“四川省”,请各位帮忙指点指点。
  • 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下的文本

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 913
精华内容 365
关键字:

selenium定位div弹窗