美文网首页
seleium新版

seleium新版

作者: 鲸随浪起 | 来源:发表于2020-06-20 15:47 被阅读0次
    image

    官网文档

    Selenium 官方参考文档:http://selenium-python.readthedocs.io/index.html

    安装

    安装客户端

    pip install selenium

    PyPI 网站下载 Selenium库https://pypi.python.org/simple/selenium

    安装浏览器驱动

    下载谷歌浏览器

    下载浏览器驱动

    https://chromedriver.storage.googleapis.com/index.html
    我的存放位置D:\webdrivers\chromedriver.exe
    browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe')

    下载解压好的chromediver.exe文件放进python安装路径下的scripts文件夹里
    browser = webdriver.Chrome()

    3个检测浏览器User-Agent信息的网站为:
    1. http://whatsmyuseragent.com/
    2. http://whatsmyua.com/
    3. http://www.useragentstring.com/

    代码

    导入的包
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver import ActionChains
    import time
    
    from selenium.webdriver.chrome.options import Options
    
    带界面
    from selenium import webdriver
    ## 创建 WebDriver 对象,指明使用chrome浏览器驱动
    browser= webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
    # 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
    browser.get('https://www.baidu.com')
    
    不带界面
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    chrome_options=Options()
    #不带界面
    chrome_options.add_argument('--headless')
    #不加载图片
    chrome_options.add_argument('blink-settings=imagesEnabled=false')
    browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe',options=self.chrome_options)
    browser.get('https://www.baidu.com')
    
    读取和使用cookies

    https://www.cnblogs.com/superhin/p/11481803.html

    选择元素的基本方法
    # 获取id标签值
    element = driver.find_element_by_id("passwd-id")
    # 获取name标签值
    element = driver.find_element_by_name("user-name")
    # 获取标签名值
    element = driver.find_elements_by_tag_name("input")
    # 也可以通过XPath来匹配
    element = driver.find_element_by_xpath("//input[@id='passwd-id']")
    

    find_element_by_xpath()用法

    find_element_by_xpath('//ul/li').text   #获取文本
    find_element_by_xpath('//ul/li').get_attribute("href")  #获取去元素,获取href元素
    

    补充

    find_elements_by_link_text (全部文本)
    find_elements_by_partial_link_text (包含某个文本)

    ID属性选择元素

    find_element_by_id("id名") //符合条件所有ID名
    find_elements_by_id("id名") //符合条件第一个ID名

    class属性选择元素

    find_elements_by_class_name('类名') //符合条件所有类名
    find_element_by_class_name('类名') //符合条件第一个类名

    tag名选择元素

    find_elements_by_tag_name('div') //选择所有的tag名为 div的元素
    find_element_by_tag_name('div') //选择第一个tag名为div的元素

    css选择元素

    find_element_by_css_selector(CSS Selector参数)
    find_elements_by_css_selector(CSS Selector参数)

    CSS Selector用法

    CSS Selector 同样可以根据tag名、id 属性和 class属性 来 选择元素

    #取tag名
    find_elements_by_css_selector('div')
    #取id
    find_element_by_css_selector('#id')  #加#号
    #取class
    find_elements_by_css_selector('.class')  #加.号
    #其他属性
    find_element_by_css_selector('[href="http://www.miitbeian.gov.cn"]')
    find_element_by_css_selector("div[class='SKnet']") #div标签class值
    find_element_by_css_selector('a[href*="miitbeian"]')  #a标签href包含的值
    find_element_by_css_selector('a[href^="http"]')  #a标签href以http开头
    find_element_by_css_selector('a[href$="gov.cn"]')  #a标签href以gov.cn结尾
    #<div class="misc" ctype="gun">沙漠之鹰</div>
    find_element_by_css_selector('div[class=misc][ctype=gun]')  #一个标签多个属性
    
    CSS Selector选择语法联合使用

    更多CSS选择器:https://www.w3school.com.cn/cssref/css_selectors.asp

    选择下级
    #选择 一个class 属性值为 copyright 的 span 节点, 
    #并且要求其 必须是 class 属性值为 footer1 的 div节点 的子节点
    div.footer1 > span.copyright  
    #也可以更简单
    .footer1 > .copyright
    #或
    .footer1  .copyright
    
    同时选择
    #同时选择所有class 为 plant 和 class 为 animal 的元素
    '.plant , .animal'
    
    #同时选择所有tag名为div的元素 和 id为BYHY的元素
    'div,#BYHY'
    
    #选择所有 id 为 t1 里面的 span 和 p 元素
    '#t1 > span , #t1 > p'
    #对应的代码如下
    elements = wd.find_elements_by_css_selector('div,#BYHY')
    for element in elements:
       print(element.text)
    
    按次序选择子节点
    #指定选择的元素 是父元素的第几个子节点
    span:nth-child(2)  #第2个子元素,并且是span类型
    #指定选择的元素 是父元素的倒数第几个子节点
    p:nth-last-child(1)  #倒数2个子元素,并且是span类型
    
    #父元素的第几个 某类型的 子节点
    span:nth-of-type(1)  #选择的是 第1个span类型 的子元素
    #父元素的 倒数第几个某类型 的子节点
    p:nth-last-of-type(2)  #选择的是 倒数第1个span类型 的子元素
    
    #父元素的 偶数节点,使用 nth-child(even)
    p:nth-child(even)  父元素的 偶数节点
    span:nth-of-type(even)  #某类型偶数节点
    #如果要选择的是父元素的 奇数节点,使用 nth-child(odd)
    p:nth-child(odd)  #父元素的 奇数节点
    p:nth-last-of-type(odd)  #某类型奇数节点
    
    image.png
    兄弟节点选择
    #相邻兄弟 关系,可以这样写 h3 + span
    #表示元素 紧跟关系的 是 加号
    
    #选择 h3 后面所有的兄弟节点 span,可以这样写 h3 ~ span
    

    text //取文本内容
    clear() //清除输入框已有的字符串

    send_keys('输入内容') //输入新的字符串
    click() //点击

    获取元素内容

    element = wd.find_element_by_id('input_name')
    print(element.get_attribute('class'))
    

    get_attribute('class') //获取元素的值
    get_attribute('outerHTML') //获取整个元素对应的HTML文本内容
    get_attribute('innerHTML') //获取某个元素内部的HTML文本内容
    get_attribute('value') //获取输入框的文本(input输入框文本)

    //有时候,元素的文本内容没有展示在界面上,或者没有完全完全展示在界面上。 这时,用WebElement对象的text属性,获取文本内容,就会有问题。
    (get_attribute('innerText') 或 get_attribute('textContent'))

    find_element 和 find_elements 的区别

    使用 find_elements 选择的是符合条件的 所有 元素, 如果没有符合条件的元素, 返回空列表

    使用 find_element 选择的是符合条件的 第一个 元素, 如果没有符合条件的元素, 抛出 NoSuchElementException 异常

    通过WebElement对象选择元素

    • 不仅 WebDriver对象有 选择元素 的方法, WebElement对象 也有选择元素的方法
    • WebElement对象 也可以调用 find_elements_by_xxx,find_element_by_xxx 之类的方法
    • WebDriver 对象 选择元素的范围是 整个 web页面, 而WebElement 对象 选择元素的范围是 该元素的内部。
    from selenium import webdriver
    
    wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
    
    wd.get('http://cdn1.python3.vip/files/selenium/sample1.html')
    
    element = wd.find_element_by_id('container')
    
    # 限制 选择元素的范围是 id 为 container 元素的内部。
    spans = element.find_elements_by_tag_name('span')
    for span in spans:
        print(span.text)
    

    等待界面出现

    implicitly_wait如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长

    from selenium import webdriver
    
    wd = webdriver.Chrome()
    
    # 设置最大等待时长为 10秒
    wd.implicitly_wait(10)
    
    wd.get('https://www.baidu.com')
    
    element = wd.find_element_by_id('kw')
    
    element.send_keys('黑羽魔巫宗\n')
    
    element = wd.find_element_by_id('1')
    
    print (element.text)
    

    异常结束

    NoSuchElementException 的意思就是在当前的网页上 找不到该元素

    frame切换/窗口切换

    使用 WebDriver 对象的 switch_to 属性,像这样
    frame_reference 可以是 frame 元素的属性 name 或者 ID

    wd.switch_to.frame(`frame_reference`)
    

    也可以根据frame的元素位置或者属性获取

    wd.switch_to.frame(wd.find_element_by_tag_name("iframe"))
    
    切换回主html
    wd.switch_to.default_content()
    
    切换到新的窗口

    在网页上操作的时候,我们经常遇到,点击一个链接 或者 按钮,就会打开一个 新窗口 。

    from selenium import webdriver
    browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe')
    browser.get('http://cdn1.python3.vip/files/selenium/sample3.html')
    link = browser.find_element_by_tag_name("a")
    link.click()
    
    #mainWindow变量保存当前窗口的句柄
    mainWindow = browser.current_window_handle
    
    for handle in browser.window_handles:
        browser.switch_to.window(handle)
        if 'Bing' in browser.title:
            break
    print(browser.title)
    
    browser.switch_to.window(mainWindow)
    
    print(browser.title)
    

    WebDriver 鼠标键盘事件

    https://www.cnblogs.com/Skyyj/p/6687028.html

    相关文章

      网友评论

          本文标题:seleium新版

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