python selenium 采坑

python selenium 采坑

系统环境:

python2
mac os 10.14.5

正文:

之前装了一个firefox就可以完美使用selenium了,但是在firefox上进行网页检查时不是很习惯。所以还是想使用chrome,但是由于selenium原生不支chrome,所以需要下载chrome driver并在生成selenium对象前把 chrome driver和chrome放到应用程序路径下,或者再初始化webdriver.Chrome对象时设置chrome driver和chrome的路径。

options = webdriver.ChromeOptions()
options.binary_location = \
    "/Applications/Google Chrome .app/Contents/MacOS/Google Chrome"

browser = webdriver.Chrome(DRIVER_BIN, chrome_options=options)

初始化好browser后,剩下的所有操作都和这个browser对象有关了。
基本操作流程是:

  1. 第一步,通过browser对象的find_element*方法来查找到页面中的element,常用的有如下方法:
    find_element_by_xpath()
    find_element_by_id()
    find_element_by_name()
  2. 这些find方法返回的都是一个或者一组element对象,接下来就是调用这些element对象的方法来实现赋值,和点击等操作。常见的使用方法有click,send_keys等。
  3. 有时点击某个按钮或者链接会新开一个页面,这时就需要使用browser的switch_to方法和window_handles属性了,如下面便是跳转到第二个页面:
    browser.switch_to.window(browser.window_handles[1])

下面的代码逻辑是登录一个网站后,点击button然后跳转到新页然后完成两个表单的填写和提交。

#!/bin/python 
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select

import os
import time

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
DRIVER_BIN = os.path.join(PROJECT_ROOT, 'bin/chromedriver')

# browser = webdriver.Chrome(executable_path=DRIVER_BIN)

# initialize 
options = webdriver.ChromeOptions()
options.binary_location = \
    "/Applications/Google Chrome .app/Contents/MacOS/Google Chrome"

browser = webdriver.Chrome(DRIVER_BIN, chrome_options=options)
browser.get('https://172.16.50.253')


def element_send_keys(browser, element, keys):
    try:
        element = browser.find_element_by_id(element)
    except Exception:
        try:
            element = browser.find_element_by_xpath(element)
        except Exception:
            element = browser.find_element_by_name(element)
    element.send_keys(keys)


def button_click(browser, element, action):
    allowed_actions = ['click', 'touch']
    if action not in allowed_actions:
        raise Exception
    try:
        element = browser.find_element_by_id(element)
    except Exception:
        element = browser.find_element_by_xpath(element)
    method = getattr(element, action)
    method()


# login
def login(browser, name, passwd):
    user_name = browser.find_element_by_id('id_username')
    user_passwd = browser.find_element_by_id('id_password')
    login_button = browser.find_element_by_id('loginBtn')
    user_name.send_keys(name)
    user_passwd.send_keys(passwd)
    login_button.click()


# create project
def create_project(browser, project_name, project_description):
    # click Administrator
    admin_entry = '//*[@id="navbar-collapse"]/ul[3]/a'
    admin_button = browser.find_element_by_xpath(admin_entry)
    admin_button.click()

    browser.switch_to.window(browser.window_handles[1])
    # click Account Centor
    account_entry = '//*[@id="dashboard-slug-identity"]'
    account_button = browser.find_element_by_xpath(account_entry)
    account_button.click()

    # click project
    project_entry = '//*[@id="sidebar-accordion-identity"]/li[1]/a'
    project_button = browser.find_element_by_xpath(project_entry)
    project_button.click()
    time.sleep(4)
    # click create project
    create_project_entry = '//*[@id="content_body"]/div[1]/div/div/div[2]/hz-resource-panel/div/ng-transclude/hz-resource-table/hz-dynamic-table/hz-magic-search-context/div/div[1]/div/actions/action-list[1]/button'
    button_click(browser, create_project_entry, 'click')

    # fill the project form
    element_send_keys(browser, 'name', project_name)
    element_send_keys(browser, 'description', project_description)

    sure_xpath = '/html/body/div[1]/div/div/div[3]/button[2]/translate/span'
    button_click(browser, sure_xpath, 'click')


# create user
def create_user(browser, name, phone, passwd, rpasswd, project, realName,
                email, cardNumber, organize):
    # click Administrator
    admin_entry = '//*[@id="navbar-collapse"]/ul[3]/a'
    button_click(browser, admin_entry, 'click')

    browser.switch_to.window(browser.window_handles[1])
    # click Account Centor
    account_entry = '//*[@id="dashboard-slug-identity"]'
    button_click(browser, account_entry, 'click')
    time.sleep(2)

    # click user
    user_entry = '//*[@id="sidebar-accordion-identity"]/li[2]/a'
    button_click(browser, user_entry, 'click')
    time.sleep(4)

    # click create project
    create_user_entry = '//*[@id="content_body"]/div[1]/div/div/div[2]/hz-resource-panel/div/ng-transclude/hz-resource-table/hz-dynamic-table/hz-magic-search-context/div/div[1]/div/actions/action-list[1]/button'
    button_click(browser, create_user_entry, 'click')

    browser.switch_to.window(browser.window_handles[1])
    element_send_keys(browser, 'name', name)
    element_send_keys(browser, 'phone', phone)
    passwd_entry = '//*[@id="password"]/div/input'
    element_send_keys(browser, passwd_entry, passwd)
    rpasswd_entry = '//*[@id="confirmPassword"]/div/input'
    element_send_keys(browser, rpasswd_entry, rpasswd)

    time.sleep(3)
    project_btn = Select(browser.find_element_by_name('project'))
    project_btn.select_by_visible_text('hello_gxj')

    element_send_keys(browser, 'realName', realName)
    element_send_keys(browser, 'email', email)
    element_send_keys(browser, 'cardNumber', cardNumber)
    element_send_keys(browser, 'organize', organize)

    submit_entry = '/html/body/div[1]/div/div/div[3]/button[2]'
    button_click(browser, submit_entry, 'click')

# create prepaid resource

login(browser, 'admin', 'cloud')
create_project(browser, 'hello_gxj', 'gxj_test')
create_user(browser,
            'albert_guan',
            '188162081211',
            'cloudSH',
            'cloudSH',
            'albert',
            'albert',
            'albert@cloud.com',
            '111',
            '1111')

time.sleep(300)
browser.close()
browser.find

总结:

虽然selenium提供了非常强大的python api能够帮助我们轻松地去控制浏览器,实现网页操作的自动化,但是对于编码不是很好以及经常变化网页html结构的网页而言,selenium也会丧失其操作上的便利性和可控性。对此而言就是巨大的业务开发量和修改频率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值