精华内容
下载资源
问答
  • 详细效果就是类似于用Firefox4+/Chrome 5+/Safari 5+/Opera 11.5+登录新浪微博后看到的个人时间轴,在翻页时可以观察到这个效果,地址栏URL变动,但是页面没有刷新,用firebug观察也观察到刷新整个页面,只有ajax...

    嘛,起因是黑子大叔在微博上的一条@信息,找起了这个的实现,看了一圈google的中文信息内似乎还没有怎么提到这个的内容,就发表上来。

    详细效果就是类似于用Firefox4+/Chrome 5+/Safari 5+/Opera 11.5+登录新浪微博后看到的个人时间轴,在翻页时可以观察到这个效果,地址栏URL变动,但是页面没有刷新,用firebug观察也观察不到刷新整个页面,只有ajax请求的翻页数据。从先前的理解来说,URL的修改必然引起(请注意我不是在说通过锚点修改)浏览器重载页面,但利用HTML5新加入的history.pushState();和history.replaceState();可以完全自己维护一个历史记录列表绕开历史记录完全由浏览器控制的机制,从而实现比锚点更加完美的一种页内更新的体验。

    代码方面很简单,只要在需要修改url的地方插入一行:

    window.history.pushState({"html":response.html,"pageTitle":response.pageTitle}, 'title', urlPath);

    //三个参数,分别为:状态对象,标题(目前被浏览器忽略),地址

    即可在历史记录里面产生一个新的历史记录(另一个replaceState方法参数完全相同,只是替代掉当前的状态)。

    在体验上,非常接近于使用锚点(window.location = “#foo”;),但是mozilla的文档提出了以下三点好处:

    新的URL可以是和原始页面URL同域下的任何URL,如果用锚点,只能更新#后面的部分

    仅在需要时更新URL,锚点的历史记录在相同时不会创建(即当前已经是”#foo”的情况下,如果再将当前页面锚点设置为”#foo”,不会产生新的历史记录)

    可以记录下任意类型的数据,使用锚点的话将要自己维护一份历史数据列表或者把数据转码到一个字符串里

    (翻译&描述的有点别扭,见笑了,不过其实应该自己也能体会到这些好处才是)

    代码:

    if(!isset($_REQUEST['page'])){

    $page = 1;

    }

    else{

    $page = intval($_REQUEST['page']);

    }

    if(isset($_REQUEST['ajaxload'])){

    echo "第{$page}页的内容";

    die;

    }

    ?>

    HTML5 修改浏览器url而不刷新页面

    var domLoaded = function(){

    if(ua != null && ua[1] < 10){

    alert('您的浏览器不支持');

    return ;

    }

    if(location.href.indexOf("?") > -1){

    var urlparts = location.href.match(/(.+?)\?.+/i);

    var urlbase = urlparts[1];

    }

    else{

    var urlbase = location.href;

    }

    var page = <?php echo $page;?>;

    var ua = window.navigator.userAgent.match(/msie (\d\.\d)/i);

    var content = document.getElementById("content");

    var loading = document.getElementById("loading");

    window.history.replaceState(

    {

    content:content.innerHTML,

    page:page

    },

    page,

    urlbase + (page > 1 ? '?page=' + page : '' )

    );

    var ajax = new XMLHttpRequest();

    var ajaxCallback = function(){

    if(ajax.readyState == 4){

    loading.style.display = 'none';

    content.innerHTML = ajax.responseText;

    window.history.pushState(

    {

    content:content.innerHTML,

    page:page

    },

    page,

    urlbase + "?page=" + page

    );

    next.href = urlbase + "?page=" + (page + 1);

    }

    };

    var next = document.getElementById('next');

    var nextClickEvent = function(event){

    if(loading.style.display != 'block'){

    loading.style.display = 'block';

    page++;

    ajax.open('GET', urlbase + '?page=' + page + '&ajaxload=on', true);

    ajax.onreadystatechange = ajaxCallback;

    ajax.send('');

    event.preventDefault();

    }

    };

    next.addEventListener('click', nextClickEvent, false);

    var popstate = function(){

    content.innerHTML = history.state.content;

    page = history.state.page;

    };

    window.addEventListener('popstate', popstate, false);

    };

    try{

    window.addEventListener('DOMContentLoaded', domLoaded, false);

    }

    catch(e){

    alert('您的浏览器不支持');

    }

    加载中

    使用 JavaScript 修改浏览器 URL 地址栏

    现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...

    使用JavaScript修改浏览器URL地址栏的实现代码【转】

    引用自http://www.jb51.net/article/42240.htm 现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起 ...

    使用JavaScript 修改浏览器 URL 地址栏

    现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...

    使用JavaScript修改浏览器URL地址栏的实现代码

    现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...

    是不是content-type&colon; text&sol;html的数据包一到,浏览器就肯定刷新页面?

    整理自:http://q.cnblogs.com/q/54726/ 是不是content-type: text/html的数据包一到,浏览器就肯定刷新页面? 或者说,浏览器收到的状态正常的conten ...

    mui 从列表进入到详情,再返回,列表页还是进入列表之前的样子,而不刷新页面

    mui 从列表进入到详情,再返回,列表页还是进入列表之前的样子,而不刷新页面

    利用javascript Location访问Url&comma;重定向&comma;刷新页面

    网上转来了, 方便以后查询参考 本文介绍怎么使用javascript Location对象读和修改Url.怎么重载或刷新页面.javascript提供了许多方法访问,修改当前用户在浏览器中访问的url ...

    HTML5 History对象,Javascript修改地址栏而不刷新页面

    一.History对象 History 对象包含用户(在浏览器窗口中)访问过的 URL. History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问. ...

    HTML5 History对象,Javascript修改地址栏而不刷新页面(二)

    一.实例说明: $('#btnOne').click(function () { var stateObject = { id: 1 }; var title = "本地首页"; ...

    随机推荐

    node-sass报错解决方法

    在Vue.js中,每一个vue文件都是一个组件,在.vue文件中可以将模板,脚本,样式写在一起,便于组织整个组件.在使用template,script时,编写css样式时,都进行的特别顺利,唯独当我想 ...

    使用date类和format类对系统当前时间进行格式化显示

    一:Date------------String 代码1:(代码二对显示出来的时间格式进行优化) package DateDemo; import java.text.SimpleDateFormat ...

    图论--最近公共祖先问题(LCA)模板

    最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...

    Orthomcl的详细使用

    参考了众多文章并结合实际操作后的感想. 参考:http://www.plob.org/2013/09/18/6174.html 参考:http://www.plob.org/2012/06/12/22 ...

    c&sol;c&plus;&plus; 数字转成字符串&comma; 字符串转成数字

    c/c++ 数字转成字符串, 字符串转成数字 ------转帖 数字转字符串: 用C++的streanstream: #include #Include

    Storm系列&lpar;三&rpar;Topology提交过程

    提交示例代码: 1  ); // 设置一个ack线程 9      conf.setDebug(true); // 设置打印所有发送的消息及系统消息 10      StormSubmitter.su ...

    使用NAT方式连网的linux服务器虚拟机搭建

    从一开始我就很纠结centos服务器搭建的过程. 由于自己方向并不在运维上,但是学习开发也需要用到Linux所以就一直没认真去学. 经过自己多方面摸索与学习找到了自己的一套方法. 首先我用到的是 ce ...

    centos安装如何选择安装包

    1.根据经验,选择安装包时应该按最小化原则,即不需要的或者不确定是否需要的就不安装,这样可以最大程度上确保系统安全. 2.如果安装过程落了部分包组或者其他伙伴安装时没选,再安装后可以按如下方式补上安装 ...

    ASP&period;NET Core MVC&plus;EF Core从开发到部署

    笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...

    lambda表达式底层处理机制

    为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先 ...

    展开全文
  • 2.1 循环任务的演进如果没有事件循环,代码运行完成,程序就终止了添加循环机制,保证程序终止,并且持续运行引入消息队列,处理其他线程发送过来的任务三、如何处理高优先级的任务?何解决单个任务执行时长过久的...

    一、参考

    1. 强烈推荐 —— 李兵老师的 《浏览器工作原理与实践》

    二、 why 事件循环?

    先举个例子:一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

    1. 最好的解决办法就是使用单线程
    2. 要想在线程运行过程中,能接收并执行新的任务,就需要采用事件循环机制

    2.1 循环任务的演进

    2.1.1 如果没有事件循环,代码运行完成,程序就终止了

    在这里插入图片描述
    代码模拟:

    void MainThread(){
      int num1 = 1+2; //任务1
      int num2 = 20/5; //任务2
      int num3 = 7*8; //任务3
      print("最终计算的值为:%d,%d,%d",num1,num2,num3)//任务4
    }
    

    2.1.2 添加循环机制,保证程序不终止,并且持续运行

    在这里插入图片描述

    代码模拟:

    //GetInput
    //等待用户从键盘输入一个数字,并返回该输入的数字
    int GetInput(){
      int input_number = 0;
      cout<<"请输入一个数:";
      cin>>input_number;
      return input_number;
    }
    //主线程(Main Thread)
    void MainThread(){
      for(;;){
        int first_num = GetInput()int second_num = GetInput();
        result_num = first_num + second_num;
        print("最终计算的值为:%d",result_num)}
    }
    

    特点:

    1. 第一点引入了循环机制
    2. 第二点是引入了事件

    2.1.3 引入消息队列,处理其他线程发送过来的任务

    在这里插入图片描述

    代码模拟:

    TaskQueue task_queue;
    void ProcessTask();
    void MainThread(){
      for(;;){
        // 阻塞等待任务
        Task task = task_queue.takeTask();
        // 处理任务
        ProcessTask(task);
      }
    }
    

    特点: 引入了消息队列

    三、如何处理高优先级的任务?

    问题引入:以DOM节点的增删改查为例,如果 DOM 发生变化,采用同步通知的方式,会影响当前任务的执行效率;如果采用异步方式,又会影响到监控的实时性。

    单线程有如下特点:

    1. 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务

    2. 那要是前面的代码不走了,后面就不走了。那的等到猴年马月啊。所以不行,

    3.1 何解决单个任务执行时长过久的问题?

    JavaScript 可以通过回调功能来规避这种问题,也就是让要执行的 JavaScript 任务滞后执行。

    3.2 如何权衡效率和实时性?—— 引用微任务的概念

    通常我们把消息队列中的任务称为宏任务,每个宏任务中都包含了一个微任务队列,在执行宏任务的过程中,如果 DOM 有变化,那么就会将该变化添加到微任务列表中,这样就不会影响到宏任务的继续执行,因此也就解决了执行效率的问题。

    等宏任务中的主要功能都直接完成之后,这时候,渲染引擎并不着急去执行下一个宏任务,而是执行当前宏任务中的微任务,因为 DOM 变化的事件都保存在这些微任务队列中,这样也就解决了实时性问题。

    在这里插入图片描述

    四、宏任务,微任务(函数)

    宏任务:script,setTimeout,setInterval,setImmediate

    微任务:Promise,process.nextTick ,MutationObserver

    我们只需记住:

    1. 当前执行栈执行宏任务完毕前,会立刻先处理所有微任务队列中的事件,然后再去宏任务队列中取出一个事件

    2. 同一次事件循环中,微任务永远在宏任务之前执行。

    3. 每个宏任务就开始一次事件循环

    在这里插入图片描述

    微宏任务执行顺序比较?

    process.nextTick() > Promise.then() > setTimeout > setImmediate;

    五、利用微任务计算宏任务计算的时间

    <ul id="container"></ul>
    
    // 记录任务开始时间
    let now = Date.now();
    // 插入十万条数据
    const total = 100000;
    // 获取容器
    let ul = document.getElementById('container');
    // 将数据插入容器中
    for (let i = 0; i < total; i++) {
        let li = document.createElement('li');
        li.innerText = ~~(Math.random() * total)
        ul.appendChild(li);
    }
    
    console.log('JS运行时间:',Date.now() - now);
    setTimeout(()=>{
      console.log('总运行时间:',Date.now() - now);
    },0)
    // print: JS运行时间: 187
    // print: 总运行时间: 2844
    

    六、Vue.nextTick 源码解析

    源码位置src\core\util\next-tick.js

    6.1 支持函数作为参数 和promise两种方式的回调

    /**
     * 将 cb 回调函数放在 micro tarsk(微任务) 中执行
     * @param {*} cb
     * @param {*} ctx
     * @returns
     */
    export function nextTick (cb?: Function, ctx?: Object) {
      let _resolve
      // 将 cb 函数存放到 callbacks 数组中
      callbacks.push(() => {
        if (cb) {
          try {
            cb.call(ctx)
          } catch (e) {
            handleError(e, ctx, 'nextTick')
          }
        } else if (_resolve) {
          _resolve(ctx)
        }
      })
      // pending 默认值是false,即在视图渲染完成之后,pending状态值为false,
      // 用户只要调用了 nextTick就会将改标记改为true,直到下一次视图渲染完成, 把nextTick 中所有的方法执行完,才会重置pending为false
      if (!pending) {
        pending = true
        // 将 flushCallbacks 方法放到  微任务(可以了解浏览器的 event loop)中执行,flushCallbacks 就是执行 callbacks 数组 中 cb 的方法
        // 微任务并不会立马执行,而是要等到当前主任务执行完,下一次主任务执行之前执行
        // 当前的主任务执行完成就会完成 虚拟dom 的对比和视图的更新,这样就实现了视图更新完成之后执行 微任务,即 cb 的方法
        timerFunc()
      }
      // $flow-disable-line
      if (!cb && typeof Promise !== 'undefined') {
        return new Promise(resolve => {
          _resolve = resolve
        })
      }
    }
    

    6.2 什么时候触发nextTick中的函数?

    if (typeof Promise !== 'undefined' && isNative(Promise)) { // 优先判断是否支持Promise, 使用Promise 微任务
      // p 就是一个 Promise 对象
      const p = Promise.resolve()
      // 只有当主任务执行完了之后才会执行 then 的方法
      timerFunc = () => {
        // 定义了一个微任务,也就是说当前主任务执行完之后,在切换到下一个主任务之前,先执行 微任务 flushCallbacks 方法
        p.then(flushCallbacks)
        if (isIOS) setTimeout(noop)
      }
      isUsingMicroTask = true
    } else if (!isIE && typeof MutationObserver !== 'undefined' && (
      isNative(MutationObserver) ||
      // PhantomJS and iOS 7.x
      MutationObserver.toString() === '[object MutationObserverConstructor]'
    )) { // 判断是否支持 MutationObserver
      let counter = 1
      const observer = new MutationObserver(flushCallbacks)
      const textNode = document.createTextNode(String(counter))
      observer.observe(textNode, {
        characterData: true
      })
      timerFunc = () => {
        counter = (counter + 1) % 2
        textNode.data = String(counter)
      }
      isUsingMicroTask = true
    } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { // 判断是否支持 setImmediate
      timerFunc = () => {
        setImmediate(flushCallbacks)
      }
    } else { // 最后选择 setTimeout ,说明一下 setTimeout 属于主任务,不属于微任务
      // Fallback to setTimeout.
      timerFunc = () => {
        setTimeout(flushCallbacks, 0)
      }
    }
    

    从代码中可以看出:

    1. 优先判断浏览器是否支持Promise,如果支持,就将nextTick中的回调函数,放在promise的“微任务”中

    2. 如果第一步不满足,再判断是否支持“MutationObserver”,创建一个节点,并且监听节点的变化,立马改变节点的值,即节点变化就触发nextTick中的函数,不过此时是在“微任务”中

    3. 如果前面两种都不满足,则判断是否支持setImmediate,如果支持,则放到宏任务中,等待浏览器调用此时定义的宏任务,不过此时的“时效性”就无法保证了

    4. 如果前面的全部都不满足,就调用setTimeout函数,此时也是将任务放到宏任务中,等待浏览器调用此时定义的宏任务,不过此时的“时效性”就无法保证了

    备注: 微任务并不会立马执行,而是要等到当前主任务执行完,下一次主任务执行之前执行,当前的主任务执行完成就会完成 虚拟dom 的对比和视图的更新,这样就实现了视图更新完成之后执行 微任务,即 cb 的方法

    6.3 nextTick的结论

    1. 只有支持PromiseMutationObserver对象的浏览器,才能保证时效性,即当前主任务执行完了之后,在下一次主任务执行之前会被调用,其他的就无法平衡这个时效性了

    2. 不论什么环境,都可以保证nextTick 的函数获取到的一定是DOM变化之后的数据

    七、总结

    1. 通过异步操作解决了同步操作的性能问题;

    2. 通过微任务解决了实时性的问题。

    展开全文
  • //退出浏览器 /*** dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别:第一个close, * 如果打开了多个页面是关干净的,它只关闭当前的一个页面。第二个quit, * 是退出了所有Webdriver所有的窗口,...

    1、环境搭建

    jdk1.6版本:selenium 2.4版本。

    jdk1.8版本:selenium3.14版本。

    (1)selenium的jar包下载:

    地址:http://selenium-release.storage.googleapis.com/index.html

    需要用:selenium-server-standalone-3.9.1.jar(需要在cmd下安装,java -jar ***),selenium-java-2.40.0.jar,selenium-java-2.40.0-srcs.jar还有它的libs。

    (2)webDriver下载:

    注意:webDriver必须与浏览器版本相对应,否则会出现问题

    2、程序代码示例

    //固定时间等待:driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);//设定最大等待时间,一旦标签存在即可返回:wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".abc")))

    WebDriver driver = new ChromeDriver(); //新建一个WebDriver 的对象,但是new 的是谷歌的驱动

    driver.get(url); //打开指定的网站

    try{

    Thread.sleep(60000);//60秒

    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

    }catch(Exception e) {

    e.printStackTrace();

    }//定位层级元素

    WebElement e = driver.findElement(By.cssSelector(".animation-toggle"));

    e.click();//等待加载完页面

    try{

    Thread.sleep(60000);//60秒

    driver.manage().timeouts().implicitlyWait(60,TimeUnit.SECONDS);//等待界面加载完

    }catch(Exception e2)

    {

    e2.printStackTrace();

    }

    SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMdd");

    Date d=newDate();

    List list = driver.findElements(By.cssSelector("img.frame"));//img标签,class为frame

    int i=-1;for(WebElement el : list)

    {

    String img_url=el.getAttribute("src");//System.out.println(img_url);

    String time = sdf.format(d.getTime()+i*24*60*60*1000);

    loadPage(img_url,type,time);

    i=i+1;

    }

    driver.quit();//退出浏览器

    3、元素定位

    (1)根据tagName

    driver.findElement(By.cssSelector("input")

    (2)根据ID

    driver.findElement(By.cssSelector("input#username"));html标签和#id

    driver.findElement(By.cssSelector("#username"));只是#id

    (3)根据className

    单一class:driver.findElement(By.cssSelector(".username"));.class

    复合class:driver.findElement(By.cssSelector(".username.**.***"));.classA.classB

    (4)根据元素属性

    1)精准匹配:

    [A]  driver.findElement(By.cssSelector("input[name=username]"));属性名=属性值,id,class,等都可写成这种形式

    [B]  driver.findElement(By.cssSelector("img[alt]"));存在属性。例如img元素存在alt属性

    [C]  driver.findElement(By.cssSelector("input[type='submit'][value='Login']"));多属性

    2)模糊匹配:(正则表达式匹配属性)

    [A]  ^=  driver.findElement(By.cssSelector(Input[id ^='ctrl']));匹配到id头部 如ctrl_12

    [B]  $=  driver.findElement(By.cssSelector(Input[id $='ctrl']));匹配到id尾部 如a_ctrl

    [C]  *=  driver.findElement(By.cssSelector(Input[id *= 'ctrl']));匹配到id中间如1_ctrl_12

    更多正则匹配原则请查看CSS3 选择器——属性选择器  http://www.w3cplus.com/css3/attribute-selectors

    (5)查询子元素

    961ddebeb323a10fe0623af514929fc1.png

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    以上代码是百度首页搜索输入框和按钮的html,下面讲解以此为例

    1)子元素   A>B

    WebElement input=  driver.findElement(By.cssSelector("form>span>input"));//搜索输入框

    2)后代元素   A空格B

    WebElement input=  driver.findElement(By.cssSelector("form input"));//搜索输入框

    3)第一个后代元素  :first-child

    WebElement span= driver.findElemet(By.cssSelector("form :first-child"));//冒号前有空格,定位到form下所有级别的第一个子元素

    可定位到三个元素:

    WebElement span= driver.findElemet(By.cssSelector("form input:first-child"));//冒号前无空格,定位到form下所有级别的第一个input元素

    可定位到两个元素:

    WebElement span= driver.findElemet(By.cssSelector("form>span:first-child"));//冒号前无空格,定位到form直接子元素中的第一个span元素

    可定位到一个元素:

    4)最后一个子元素   :last-child  [类同:first-child]

    WebElement userName = driver.findEleme(By.cssSelector("form :last-child"));//冒号前有空格,定位到form下所有级别的第一个子元素

    5)第2个子元素    :nth-child(N)  [类同:first-child]

    WebElement userName = driver.findElemet(By.cssSelector("form#form :nth-child(2)"));//冒号前有空格,定位到form下所有级别的第二个子元素

    (6)查询兄弟元素

    driver.findElement(By.cssSelector("form#form span+span")); 定位到a 再定位到和它相邻的b

    4、页面响应等待问题

    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);不靠谱

    wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".abc")));不实用

    Thread.sleep(60000);比较实用

    最后,在附赠一个列子:

    importjava.util.Iterator;importjava.util.List;importjava.util.Set;importjava.util.concurrent.TimeUnit;importorg.openqa.selenium.Alert;importorg.openqa.selenium.By;importorg.openqa.selenium.Cookie;importorg.openqa.selenium.JavascriptExecutor;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.interactions.Actions;importorg.openqa.selenium.support.ui.Select;public classTest1 {public static voidmain(String[] args) {

    System.setProperty("webdriver.chrome.driver", "D:\\webDriver\\chromedriver.exe");//chromedriver服务地址

    WebDriver driver = new ChromeDriver(); //新建一个WebDriver 的对象,但是new 的是谷歌的驱动

    String url = "http://www.baidu.com";

    driver.get(url);//打开指定的网站//driver.navigate().to(url);//打开指定的网站

    /**

    * driver.findElement(By.id("kw")).sendKeys(new String[] { "hello" });//

    * 找到kw元素的id,然后输入hello driver.findElement(By.id("su")).click(); // 点击按扭*/

    try{/*** WebDriver自带了一个智能等待的方法。 dr.manage().timeouts().implicitlyWait(arg0, arg1);

    * Arg0:等待的时间长度,int 类型 ; Arg1:等待时间的单位 TimeUnit.SECONDS 一般用秒作为单位。*/driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);

    }catch(Exception e) {

    e.printStackTrace();

    }//获取当前浏览器的信息

    System.out.println("Title:" +driver.getTitle());

    System.out.println("currentUrl:" +driver.getCurrentUrl());//执行js脚本

    String jString = "alert('122')";

    ((JavascriptExecutor) driver).executeScript(jString);//获取单个元素

    WebElement element = driver.findElement(By.id("wrapper"));

    System.out.println(element.getAttribute("class"));//获取多个元素

    List elList = driver.findElements(By.tagName("input"));for(WebElement e : elList) {

    System.out.println("获取多个元素:"+e.getAttribute("name"));

    }//定位层级元素

    WebElement e = driver.findElement(By.cssSelector("#qrcode-item qrcode-item-1"));

    List list = e.findElements(By.tagName("div"));for(WebElement e1 : list) {

    System.out.println("定位层级元素:"+e1.getAttribute("class"));

    }//获取当前的窗口

    String currentWindow =driver.getWindowHandle();//获取所有的窗口

    Set handles =driver.getWindowHandles();//遍历窗口

    Iterator iterator =handles.iterator();while(iterator.hasNext()) {if (currentWindow ==iterator.next())continue;//跳转到弹出的窗口

    WebDriver driver2 =driver.switchTo().window(iterator.next());

    driver2.getTitle();

    }//处理弹出框

    Alert alert =driver.switchTo().alert();

    alert.getText();

    alert.dismiss();//相当于点击取消

    Alert confirm=driver.switchTo().alert();

    confirm.getText();

    confirm.accept();//相当于点击确认

    Alert prompt=driver.switchTo().alert();

    prompt.getText();

    prompt.accept();

    prompt.sendKeys("测试1");//输入值//处理下拉列表

    Select select = new Select(driver.findElement(By.id("select")));

    select.selectByIndex(1);

    select.selectByValue("西安");

    select.selectByVisibleText("咸阳");//获取下拉框的全部选项

    List list2 =select.getOptions();for(WebElement webElement : list2) {

    webElement.click();//点击下拉框

    }//处理cookie//添加一个cookie

    Cookie cookie = new Cookie("COOKIE", "NAME","D://COOKIES");

    driver.manage().addCookie(cookie);//获取cookies

    Set set =driver.manage().getCookies();

    Iterator iterator2 =set.iterator();while(iterator2.hasNext()) {

    Cookie c=iterator2.next();

    c.getName();

    c.getValue();

    c.getPath();

    }

    driver.manage().deleteAllCookies();

    driver.manage().deleteCookie(cookie);

    driver.manage().deleteCookieNamed("COOKIE");//等待加载完页面

    try{

    driver.manage().timeouts().wait(1);

    driver.manage().timeouts().implicitlyWait(1,TimeUnit.SECONDS);//等待界面加载完

    } catch(InterruptedException e2) {

    e2.printStackTrace();

    }//模拟鼠标和键盘操作

    Actions action = newActions(driver);

    action.click();

    action.dragAndDrop(element, e);

    action.sendKeys(element,"12222").perform();

    action.click(element);

    action.keyDown(currentWindow);//driver.quit();//退出浏览器

    /*** dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别:第一个close,

    * 如果打开了多个页面是关不干净的,它只关闭当前的一个页面。第二个quit,

    * 是退出了所有Webdriver所有的窗口,退的非常干净,所以推荐使用quit最为一个case退出的方法。*/}

    }

    展开全文
  • 用户在搜索框输入关键词后,相关小程序会在关键词智能推荐列表优先推荐,并直接展示相关内容。墨迹天气、腾讯翻译君等小程序已经成功入驻。除此之外,QQ 浏览器小程序兼容适配了微信小程序,号称「只需三步」开...

    继微信、QQ 之后,QQ 浏览器上也可以使用小程序了。

    现已实现与微信小程序打通。QQ 浏览器 Android 版现已上线小程序,在搜索的场景下,小程序嵌入 QQ 浏览器「搜索直达」,作为直接的内容承载。用户在搜索框输入关键词后,相关小程序会在关键词智能推荐列表优先推荐,并直接展示相关内容。墨迹天气、腾讯翻译君等小程序已经成功入驻。

    除此之外,QQ 浏览器小程序兼容适配了微信小程序,号称「只需三步」开发者即可完成适配工作将微信小程序移植到 QQ 浏览器上运行。

    接下来将为大家一一讲解其中的细节和关注点:

    安装并注册 QB 小程序调试工具

    在你正式上手调试前,我们需要提醒以下三点注意事项:

    目前开发者工具只支持安卓;

    小程序的正式名称、图标和简介是用户可见的,并且填写完成后暂时没有办法修改,所以填写一定要谨慎;

    qbDebugKey 是设备唯一的,每台手机都会生成一个 qbDebugKey。

    目前 QB 小程序的调试页面和介绍页面还十分简陋,也没有相关的 PC 端开发工具,所以开发者仍需在微信开发者工具上完成小程序的开发,然后适配成 QB 小程序。

    1. QB 小程序调试页面。

    2. 进入调试页面后,需先完成「注册」。在注册页面中:

    packageName 是小程序的唯一标识,一旦注册成功,packageName 会在后台与 qbDebugKey 绑定,注册后只有当前设备可以使用这个 packageName 进行登录,如果需要给这个 packageName 绑定其他开发设备,可以在登录后进行添加。

    开发者昵称是 qbDebugKey 的别名,方便开发者管理开发设备。

    小程序的正式名称、图标和简介是用户可见的,注册完成后暂时不提供修改方法,请谨慎填写。

    同时,你需要将 qbDebugKey 添加到微信小程序的 app.json 配置文件里。

    注意:只有在 app.json 里配置过测试机生成的 qbDebugKey,测试机才能使用 QQ 浏览器小程序调试工具调试该小程序。一台手机对应一个 qbDebugKey。

    3. 如果你完成了注册或已有其他开发者为你添加了开发权限,输入对应小程序 packageName 并点击「登录」按钮进入进入开发者管理后台页面。

    在此页面中,你可以点击「开发者权限管理」添加其它开发设备,需要输入待添加设备的 qbDebugKey 和昵称,添加成功后,新设备就可以使用该 packageName 进行登录了。

    安装调试版 QQ 浏览器

    点击「启动 QB 打开小程序」按钮,如果没有下载调试版 QQ 浏览器,这步操作会下载调试版 QQ 浏览器。

    如果你手机中未安装 QQ 浏览器 或安装的版本非正确的调试版本,在点击后会提示「请先下载调试版 QQ 浏览器」,按照提示再次点击按钮即可开始下载安装;安装完成后再次回该页面点击启动按钮即可拉起 QQ 浏览器启动要调试的小程序。

    调试兼容性

    在以上两步完成后,接下来我们需要调试兼容性,直到小程序能够跑起来。这里主要注意 QB 小程序和微信小程序的几点区别:

    QB 小程序的登录态与微信小程序不互通,并且没有 unionId 概念

    QB 小程序不支持自定义导航栏颜色

    QB 小程序的 canvas 不支持 measureText, 意味着没有办法在 canvas 上进行文本换行

    QB 小程序不支持下拉刷新

    QB 小程序的 intersectionObserver 无法使用

    QB 小程序不支持模版消息

    QB 小程序不支持打开跳转其他小程序

    微信强相关的 API 都不支持

    在云里,为各行业商户搭建自己的小程序。微信号:zyl-kf

    展开全文
  • 前言前段时间接到一个需求,我们的web系统有电话接听功能。产品希望有电话呼入的时候,能够有效提示用户,无论用户是否在当前的系统页签上,甚至浏览器被最小化以后也能提醒用户。就着这个需求,我...
  • 前端面试-浏览器原理

    2021-09-17 17:27:08
    一、浏览器 什么是URL 组成部分: protocol:协议,表明浏览器必须使用何种协议 domain:域名,表示正在请求哪个服务器 port:端口 path:网络服务器上资源的路径 parameters/query:提供给网络服务器的额外参数 ...
  • 还有可能是这样,不管你的浏览器到底长啥样,总之就是一进标签页就是看到各种消息、新闻资讯,不仅好看还影响心情。 今天就安利一款超级棒的浏览器主页——Speedceo! 它,简约干净,消息推广都是靠边站。 天,这...
  • 点击关注公众号,回复“1024”获取2TB学习资源!作者|Scott Gilbertson编译|核子可乐、燕珊苹果的 Safari 浏览器在支持 Web 功能方面远远落后于其他竞争对手,...
  • 【摘要】PHP即“超文本预处理器”,是...下面是php怎么清除浏览器中的cookie,我们一起来看看php怎么清除浏览器中的cookie的具体内容吧!php怎么清除浏览器中的cookiephp清除浏览器中的cookie的方法:可以利用set...
  • 检测扩展的可访问资源【推荐】2. 发送消息给插件判断返回信息3. 插件修改页面源代码,写入插件标识,js检测标识4. window.postMessage发送消息5. 通过共享资源方式5. NavigatorPlugins.plugins 环境: chrome: 90 1...
  • 今天看到一则消息称,Canonical创始人Mark Shuttleworth在接受采访中表示未来版本的Ubuntu Linux将可能用Chrome替代Firefox作为默认浏览器。计划于10月发布的Ubuntu 11.10的默认浏览器仍是Firefox;12.04的可能性也...
  • 浏览器内置对象/事件/ajax 浏览器是一个 JS 的运行时环境,它基于 JS 解析器的同时,增加了许多环境相关的内容。用一张图表示 各个运行环境和 JS 解析器的关系如下: 我们把常⻅的,能够用 JS 这⻔语言控制的内容...
  • 【摘要】PHP即“超文本...下面是php如何禁止浏览器使用缓存页面,我们一起来看看php如何禁止浏览器使用缓存页面的具体内容吧!php禁止浏览器使用缓存页面的方法:1、设置此页面的过期时间,代码为【header ( " Exp...
  • 百度浏览器app下载

    2021-06-04 08:55:54
    进入到手机百度浏览器的主界面,查看书签历史,点击浏览器右下角我的头像,进入设置页面后,在百度浏览器的首页中点击底部导航栏中的选项,在消息设置中即可看到,打开一个网页,选择网页工具,欢迎来宝哥软件园...
  • 知道大家有没有账号中招了呀? 今天我们来详细的讲一讲,怎么避免自己的Facebook广告账号被封掉,以及如何保养和维护我们的广告账号?   为什么要保养和维护我们常用的广告账号? 大家都知道,Facebook对于广告...
  • 浏览器缓存详解

    2020-12-18 15:51:46
    什么是浏览器缓存?      浏览器缓存是为了节约网络的资源加速浏览,浏览器在用户磁盘或者内存上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘或者...
  • 如何理解浏览器缓存

    2021-03-29 23:08:02
    比如说直接使用缓存而发起请求,或者发起了请求但后端存储的数据和前端一致,那么就没有必要再将数据回传回来,这样就减少了响应数据。 接下来的内容中我们将通过缓存位置、缓存策略以及实际场景应用缓存策略来...
  • (视频教程推荐:php视频教程)一、对于静态页(就是通过meta标签来设置)或者通过pragma no-cache来设置,pragma出现在http-equiv属性中,使用content属性的no-cache值表示是否缓存网页(为了提高速度一些浏览器会缓存...
  • 使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容直接相关的动作。BOM缺乏标准,JavaScript语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分。BOM...
  • ★Chrome插件就是我们运行在Chrome浏览器 上的扩展程序,比如说vue-devtool。准确的说,其实更应该叫做Chrome扩展,因为插件是更偏向于底层的技术。Chrome插件本质上来说,就是利用WEB开发技术,包括HTML、CSS和JS等...
  • 文末有福利前言作为一名前端er,日常工作打交道最多(之一)的莫过于熟悉而又陌生的浏览器了,熟悉是每天都会基于浏览器的应用层面之上码业务,陌生是很多人可能跟我一样熟悉其内部运行原理,比如j...
  • Unity关于浏览器插件相关的一些资源介绍和分享,针对浏览器开发时有一个很好地开始哦!
  • CSDN浏览器助手新版本 9 月强势上线,更新功能介绍~
  • 1. 浏览器存储的方式有哪些? 数据生命周期 数据存储大小 与服务端通信 cookie 一般由服务器生成,可以设置过期时间 4K 每次都会携带在 header 中,影响请求性能影响 localStorage 除非被清理,否则一直...
  • 网关消息认证服务器可达 内容精选换一换API的响应码如何定义?响应信息由后端API服务定义,API网关只做透传。响应信息由后端API服务定义,API网关只做透传。使用VPC通道,后端服务的主机端口怎么填写?填写API后端...
  • 2、打开IE浏览器,勾选“显示友好的http错误消息”;3、浏览器要打开调试模式,查看php错误信息即可。本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。浏览器打印PHP错误信息(web调试会用到)1、修改php.ini文件...
  • 目录一、前言二、缓存位置1.Service Worker2.Memory Cache3.Disk Cache4.Push Cache三、缓存过程分析四、强缓存1.Expires2.Cache-Control3.Expires和Cache-Control两者对比五、协商缓存1.Last-Modified和...常变化的
  • 8.31 http 浏览器 面经

    2021-08-31 11:23:34
    并且是同源的 Cookie:cookie 数据始终在同源的 http 请求中携带,可以在浏览器和服务器端来回传递,存储容量 小,只有大约 4K 左右 sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就可能持久保持, ...
  • 本篇简介本篇的小目标...既然是相互通信,自然包含两个方向:页面向浏览器发送消息浏览器向页面发送消息页面向浏览器发送消息为了实现页面向浏览器发送消息,需要在一定程度上实现在页面中访问Qt对象。Qt官方的推荐...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,222
精华内容 30,888
关键字:

如何让浏览器不推荐消息