欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python selenium 采坑

程序员文章站 2022-05-19 10:10:43
...

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',
            '[email protected]',
            '111',
            '1111')

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

总结:

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

相关标签: selenium python