• Python爬虫-selenium的使用(2)


    使用selenium打开chrome浏览器百度进行搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait

    import time
    brower = webdriver.Chrome()

    try:
    brower.get('https://www.baidu.com/')
    input = brower.find_element_by_id('kw')#通过id寻找元素
    input.send_keys('Python')#在找到的input输入框内输入Python
    input.send_keys(Keys.ENTER)#输入键盘的Enter
    wait = WebDriverWait(brower,10)#设置wait的超时时间
    wait.until(EC.presence_of_element_located((By.ID,'content_left')))#等待直到出现id是conten_left的元素加载出来的时候,最大等待时间不超过10秒
    print(brower.current_url)#打印url
    print(brower.get_cookies())#打印现在的cookies
    print(brower.page_source)#打印网页源代码

    time.sleep(5)
    except Exception as e:
    print(e)
    finally:
    brower.close()

    还可以使用其他浏览器,比如:Firefox、Edge、以及一些手机浏览器等

    1
    2
    3
    4
    5
    6
    7
    8
    from selenium import webdriver


    brower = webdriver.Chrome()
    brower = webdriver.Firefox()
    brower = webdriver.Edge()
    brower = webdriver.PhantomJS()
    brower = webdriver.Safari()

    注意每个浏览器都有自己对应的类似chrome浏览器的chromedriver驱动可执行文件。

    2使用selenium打开淘货搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    brower = webdriver.Chrome()
    try:
    brower.get('https://www.taobao.com/')
    search_input = brower.find_element_by_id('q')
    search_input.send_keys('iPhone')
    time.sleep(2)
    search_input.clear()
    time.sleep(1)
    search_input.send_keys('iPad')
    time.sleep(1)
    search_button = brower.find_element_by_class_name('btn-search')
    time.sleep(1)
    search_button.click()
    time.sleep(10)
    except Exception as e:
    print(e)
    finally:
    brower.close()

    打开淘宝,搜索‘iPhone’然后删除,接着搜索‘iPad’

    3.动作链,实现拖拽

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from selenium.webdriver import ActionChains


    brower = webdriver.Chrome()
    try:
    url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    brower.get(url)
    brower.switch_to.frame('#iframeResult')#切换到子页面中'iframeResult'是子页面的id名,也可以根据name inex 甚至webElement对象定位
    source = brower.find_element_by_css_selector('#draggable')
    target = brower.find_element_by_css_selector('#droppable')
    actions = ActionChains(brower)#构建action
    actions.drag_and_drop(source,target)#
    actions.perform()#调用perform()就是执行上面的动作链
    except Exception as e:
    print(e)
    finally:
    brower.close()

    ActionChains是什么呢?顾名思义,是一个动作链,如果在一个用例中只有一两个动作,那么用之前讲过的简单版的就可以了,如果动作很复杂,那么可以使用这个了。

    1.ActionChains是自动执行低级交互的一种方式, 大专栏  Python爬虫-selenium的使用(2)例如:鼠标移动,鼠标点按,键盘操作,文本操作等。
    2.当我们调用这里的方法时,这些操作会被先储存在一个队列中,当我们调用perform()方法时,队列中的操作会被按顺序执行,执行后队列被清空。

    iframe的切换

    参看网址:https://blog.csdn.net/huilan_same/article/details/52200586
    frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

    1.怎么切到frame中(switch_to.frame())

    selenium提供了switch_to.frame()方法来切换frame

    1
    switch_to.frame(reference)

    不得不提到switch_to_frame(),很多人在这样写的时候会发现,这句话被划上了删除线,原因是这个方法已经out了,之后很有可能会不支持,建议的写法是switch_to.frame()

    reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象,假设有如下HTML代码 index.html:

    1
    2
    3
    4
    5
    6
    7
    8
    <html lang="en">
    <head>
    <title>FrameTest</title>
    </head>
    <body>
    <iframe src="a.html" id="frame1" name="myframe"></iframe>
    </body>
    </html>

    想要定位其中的iframe并切进去,可以通过如下代码:

    1
    2
    3
    4
    5
    6
    from selenium import webdriver
    driver = webdriver.Firefox()
    driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
    # driver.switch_to.frame("frame1") # 2.用id来定位
    # driver.switch_to.frame("myframe") # 3.用name来定位
    # driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement对象来定位

    通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:
    1.index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
    2.WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象

    比如:

    1
    <iframe src="myframetest.html" />

    用xpath定位,传入WebElement对象:

    1
    driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'myframe')]"))
    2.从frame中切回主文档(switch_to.default_content())

    切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。

    1
    driver.switch_to.default_content()
    3.嵌套frame的操作(switch_to.parent_frame())

    有时候我们会遇到嵌套的frame,如下:

    1
    2
    3
    4
    5
    <html>
    <iframe id="frame1">
    <iframe id="frame2" / >
    </iframe>
    </html>

    1.从主文档切到frame2,一层层切进去

    1
    2
    driver.switch_to.frame("frame1")
    driver.switch_to.frame("frame2")

    2.从frame2再切回frame1,这里selenium给我们提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。

    1
    driver.switch_to.parent_frame()  # 如果当前已是主文档,则无效果

    有了parent_frame()这个相当于后退的方法,我们可以随意切换不同的frame,随意的跳来跳去了。

    所以只要善用以下三个方法,遇到frame分分钟搞定:

    1
    2
    3
    driver.switch_to.frame(reference)
    driver.switch_to.parent_frame()
    driver.switch_to.default_content()

    另外补充一下,之前曾看到过用点分法来切入嵌套frame的方法,但我试验之后发现并不能定位到frame:

    1
    driver.switch_to.frame('frame1.0.frame3')

    据说以上代码可以切到 “frame1” 下的 “第一个frame” 下的 “frame3” 中。

    Selenium官方文档

    点击查看Selenium官方文档

  • 相关阅读:
    centos7安装kubenetes
    用户密码字典
    curl使用
    docker部署rabbitmq集群
    记一次使用docker搭建fastdfs服务的过程
    filebeat删除多余标签
    Python format格式化输出
    python3 统计NGINX pv uv 最多IP访问
    linux修改网卡名为eth0
    模式查找
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12361240.html
Copyright © 2020-2023  润新知