zoukankan      html  css  js  c++  java
  • selenium笔记(1)

    selenium笔记(1)

    一、关闭页面:
    1.driver.close() 关闭当前页面
    2.driver.quit() 退出整个浏览器

    二、定位元素:
    1.find_element_by_id: 根据id来查找某个元素。等价于:
    submitTag=driver.find_element_by_id('su')
    submitTag1-driver.find_element(By.ID,'su') #如果要用这种方法 必须导入 from selenium.webdriver.common.by import By

    2.find_element_by-c1ass-name: 根据类名查找元素。等价于:
    submitTag=driver.find_element_by_c1ass_name('su')
    submitTag1=driver.find_element(By.CLASS_WAME,'SU')

    3.find_element_by-name: 根据name属性的值来查找元素。等价于:
    submitTag-driver.find_element_by_name('email')
    submitTagl=driver.find_element(By.MAME,'email')

    4.find_element_by_tag.name: 根据标签名来查找元素。等价于:
    submitTag=driver.find_element_by._tag.name(‘div')
    submitTagl=driver.find_element(By.TAG_MAME,’div’)

    5.find_element_by_xpath: 根据xpath来获取元素。等价于:
    submitTag =driver.find_element_by_xpath("//div")
    submitTag1-driver.find_element(By.XPATH,//div")

    6.find_element_by_css_selector: 根据css选择器选择元素。等价于:
    submitTag = driver.find_element_by_css_selector("//div')
    submitTag1 = driver.find_element(By.CSS_SELECTOR,"//div")

    注意:
    1.如果只是想要解析网页中的数据,那么推荐将网页源代码扔给lxml解析。因为lxml底层使用的是C语言,所以解析效率会更快
    2.如果是想要对元素进行一些操作,比如给一个文本框输入值,或者是点击某个按钮,那么久必须使用selenium给我们提供的查找元素的方法。

    三、常见表单元素 :
    1.input type='text/password/email/number'
    2.button input[type='submit']
    3.checkbox input[type='checkbox']
    4.select: 下拉列表

    操作表单元素:
    1.操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value),将数据填充进去。示例代码如下:
    inputTag = driver.find_element_by_id("kw")
    inputTag.send_keys('python")
    使用clear方法可以清除输入框中的内容。示例代码如下:
    inputTag.clear()

    2.操作checkbox:因为要选中checkbox标签,在网页中是通过鼠标点击的。因此想要选中checkbox标签,那么先选中这个标签,然后执行click事件。示例代码如下:
    rereaberTag = adriver.find_element_by_name("resemberMe")
    rereaberTag.click() #执行鼠标点击 (选择) 取消选择在调用一次就行

    3.选择select:select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。示例代码如下:
    from selenium.webdriver.support.ui import Select
    #选中这个标签,然后使用Select创建对象
    selectTag=Select(driver.find_element_by_name("jumpHenu"))
    #根据索引选择
    selectTag.select_by_index(1)
    #根据值选择
    selectTag.select_by_value("http://www.95yueba.com")
    #根据可视的文木选择
    selectTag.select_by_visible_text("95秀客户端")
    #取简选中所有选项
    selectTag.deselect_all()

    四、行为链
    有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类 ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。那么示例代码如下:
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains #导入行为链
    driver_path = r"D:Program Files (x86)GoogleChromeApplicationchromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get("https://www.baidu.com/")

    inputTag = driver.find_element_by_id('kw') #选中输入框标签
    submitBtn = driver.find_element_by_id('su') #点击按钮 (百度一下按钮)

    actions = ActionChains(driver) #创建一个行为链对象
    actions.move_to_element(inputTag) #鼠标移到输入框
    actions.send_keys_to_element(inputTag,'python') #输入键值
    actions.move_to_element(submitBtn) #点击提交
    actions.perform() #執行 行为链

    #更多鼠标相关操作:
    click_and_hold(element) 点击但不松开鼠标
    context_click(element) 右击
    double_click(element) 双击


    五、cookie操作:
    # 1.获取所有的 cookie:
    for cookie in driver.get_cookies():
    print(cookie)
    # 2.根据cookie的key获取value:
    value = driver.get(cookie(key)
    # 3.删除所有的cookie:
    driver.delete_all_cookies())
    # 4.删除某个 cookie:
    driver.delete_cookie(key)

    六、页面等待:
    现在的网而越来越多采用了Ajax技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待、一种是显式等待。

    1.隐式等待(获取一个不存在的元素时,给定一个确切的时间(指定时间)):调用driver.implicitly_wait。那么在获取不可用的元素之前,会先等待10秒中的时间。示例代码如下:
    driver = webdriver.Chrome(executable_pathedriver_path)
    driver.implicitly_wait(16)
    #请求网页
    driver.get("https://www.douban.com/")

    2.显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted.conditions 期望的条件和selenium.webdriver.support.ui.webDriverwait来配合完成。示例代码如下:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverwait
    from selenium.webdriver.support import expected_conditions as EC

    driver_path = r"D:Program Files (x86)GoogleChromeApplicationchromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get("http://somedomain/url_that_delays_loading")
    try:
    element=WebDriverWait(driver,10).until( #最多等待10秒 知道until中的元素By.ID出现
    EC.presence_of_element_located((By.ID,"myDynamicElement"))
    )
    finally:
    driver. quit()




    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 lxml import etree
    import re
    import time
    
    class pages_url(object):
        driver_path = r"D:Program Files (x86)GoogleChromeApplicationchromedriver.exe"
    
        def __init__(self):
            self.driver = webdriver.Chrome(executable_path=pages_url.driver_path)
            self.url = "https://www.lagou.com/zhaopin/Python/?labelWords=label"
            self.position = []
    
        def run(self):
            self.driver.get(self.url)
            while True:
                source = self.driver.page_source
                self.page_list(source)
                #等待(请求时长)
                WebDriverWait(driver=self.driver,timeout=10).until(
                    EC.presence_of_element_located((By.XPATH,"//div[@class='pager_container']/a[last()]"))
                )
                try:
                    next_btn = self.driver.find_element_by_xpath("//div[@class='pager_container']/a[last()]")      #点击下一页
                    if "page_no pager_next_disabled" in next_btn.get_attribute("class"):
                        break
                    else:
                        next_btn.click()
                except:
                    print(source)
                time.sleep(1)
    
        def page_list(self,source):
            html = etree.HTML(source)
            page_xqy_list = html.xpath("//a[@class='position_link']/@href")             #得到首页(1)子链接
            print(page_xqy_list)
            print("1121")
            for page_xqy in page_xqy_list:
                print(page_xqy)
                self.page_xq(page_xqy)                          #访问子链接(详情页)
                time.sleep(1)
    
        #详情页
        def page_xq(self,page_xqy):
            # self.driver.get(page_xqy)
            print(page_xqy)
            self.driver.execute_script("window.open('%s')" %page_xqy)           #打开新窗口
            self.driver.switch_to_window(self.driver.window_handles[1])         #在新窗口作业
            # try:
            #     WebDriverWait(driver=self.driver, timeout=10).until(
            #     EC.presence_of_element_located((By.XPATH,"//div[@class='job-name']/span[@class='name']"))
            #     )
            # except:
            #     print("chucou")
            source = self.driver.page_source
            self.page_allxq(source)                 #爬取详情页信息
            #关闭当前详情页
            self.driver.close()
            #继续切换回职位列表页
            self.driver.switch_to_window(self.driver.window_handles[0])
    
            #捕获详情页
        def page_allxq(self,source):
            html = etree.HTML(source)
    
            # zhiwei = html.xpath("//span[@class='name']/text()")[0].strip()
            xq = html.xpath("//dd[@class='job_request']//span")
            print("1")
            many = xq[0].xpath(".//text()")[0].strip()
            address = xq[1].xpath(".//text()")[0].strip()
            many = re.sub(r'[s/]','',many)
            address = re.sub(r'[s/]', '', address)
            jinyan = xq[2].xpath(".//text()")[0].strip()
            jinyan = re.sub(r'[s/]','',jinyan)
            xueli = xq[3].xpath(".//text()")[0].strip()
            xueli = re.sub(r'[s/]', '', xueli)
            ms_txt = ''.join(html.xpath("//dd[@class='job_bt']//text()")).strip()
            deac = {
                'many': many,
                'address': address,
                'jinyan': jinyan,
                'xueli': xueli,
                'ms_txt': ms_txt,
            }
            self.position.append(deac)
            print(deac)
    
    
    
    
    
    
    
    
    
    if __name__ == '__main__':
    
        pages = pages_url()
        pages.run()
        # print(pages.get_list())
    

      



  • 相关阅读:
    最长公共子串
    Windows 下GitHub 安装和使用
    JSON 解析
    利用bootsrap控件 实现文件上传功能
    CCF 工资计算
    Java 对象引用以及对象赋值
    Java 关于创建String对象过程的内存分配
    JAVA堆内存和栈内存初步了解
    URAL 1152. False Mirrors (记忆化搜索 状压DP)
    POJ 1113 Wall(Graham求凸包周长)
  • 原文地址:https://www.cnblogs.com/c-pyday/p/10543168.html
Copyright © 2011-2022 走看看