美文网首页
解决selenium中webdriver办不到的事情

解决selenium中webdriver办不到的事情

作者: Judy警官 | 来源:发表于2019-07-17 15:28 被阅读0次

    1.有些元素,你用尽办法定位到了,但是调用click方法报错

    下图中,测试步骤是点击右上角【三个横杠】按钮,调出下拉框,点击下拉框中的【首页】按钮。


    image.png

    笔者在调试的时候已经定位到了这个【首页】按钮,但是调用click()方法报错,代码如下:

    readbookPage.IndexButton().click()#这里IndexButton()是自己封装的代码,实际上就是使用webdriver的的find_element的方法,readbookPage.IndexButton()得到的是一个element。
    

    报错:

    selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
    

    调试的时候发现在chrome的手机模拟器里,点击了【三个横杠】按钮后,下拉框就收起来了(手动操作页面的时候是不会收起来的)。我们知道,webdriver只能定位和操作展示出来的元素,所以就不能点击【首页】按钮了,这个时候就该js上场了,代码如下:

    IndexButtonJS = "document.getElementsByClassName('jdr-dropdown-item')[0].click()"
    browser.execute_script(IndexButtonJS)
    

    document.getElementsByClassName('jdr-dropdown-item')[0].click()这句js代码的意思是,找到class为“jdr-dropdown-item”的元素组中的第一个元素(下标从0开始),然后单击这个元素。

    2.有些元素,需要你滑动屏幕让它展示出来,才能定位和操作

    下图中是某一本书的目录,测试步骤是点击不带锁标志的章节的上一节,也就是“发生变化的5个层次”这个目录(这个章节的目录没有展示在第一屏)。


    image.png

    首先需要滑动屏幕,使得目标章节目录在屏幕上显示,然后点击该章节目录。webdriver很难实现滑动屏幕并同时判断目标元素是否已显示出来,js就能轻松实现,代码如下:

     scrollJS1 = "document.getElementsByClassName('cell tap-active cell_access no-can-read')[0].scrollIntoView(true);"
     browser.execute_script(scrollJS1)
    

    scrollIntoView(true)的意思就是,滑动屏幕,直到class为cell tap-active cell_access no-can-read的元素组中第一个元素显示出来。
    也可以采用参数的形式,如代码:

     browser.execute_script("arguments[0].scrollIntoView(false);", first_need_pay_chapter)
    

    first_need_pay_chapter是已经拿到的页面元素,这种方式比非参数化的方式兼容性要好。有时候前端框架的原因,第一种方式不能用,可以用第二种。
    另外还有两个滚动屏幕的方式:

    scrollJS="window.scrollTo(0,document.body.scrollHeight);"#表示滚动到屏幕最底部
    scrollJS="window.scrollBy(0,400)"#表示向下滚400像素(第一个参数代表横向滚动像素数,第二个代表竖向滚动像素数)
    

    3.想改变某个元素的某个属性值(webdriver只有get_attribute方法)

    页面上的很多元素,有的时候是不展示的,页面如下,图中红色圈起来的部分折叠了部分功能


    image.png

    该部分的html代码如下:


    image.png
    其中div标签的style属性值为"display:none;"。如果在不能通过正常步骤把这部分功能展示出来,就可以使用js改变元素的属性值使之展示出来。把style属性值设置为"display:block;"即可,代码如下:
    elementObj=browser.find_element_by_xpath('//div[@class="jdr-card"]')
    attributeName="style"
    value="display:block;"
    browser.execute_script("arguments[0].setAttribute(arguments[1],arguments[2])", elementObj,attributeName, value)
    

    其中arguments[0] -[2]分别会用后面的elementObj、attributeName和value参数值进行替换。运行后效果如下图,目标元素已经展示:


    image.png

    4.页面上的元素不可点击时(click()不起作用,而你又想点击这个元素

    以下是center_section这个元素html代码:

     <article class="rp_center" style="-webkit-user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></article>
    

    如果用click()会报错:

    selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
    

    猜测:article这个标签可能是前端框架定义的组件,而且并没有click这个方法,所以会报错。现在前端框架好多元素都是开发者自定义的,所以这种情况比较常见,换成下面这段代码即可。

     ActionChains(browser).move_to_element(center_section).click().perform()
    

    参考:https://zhuanlan.zhihu.com/p/31604356

    相关文章

      网友评论

          本文标题:解决selenium中webdriver办不到的事情

          本文链接:https://www.haomeiwen.com/subject/jrwscctx.html