独书先生 Menu

All items for 9月, 2021

js颜色值按深浅排序 支持rgb/hex/hsl

根据颜色深浅排序

需求

最近参照组件库的设计,获取常用的组件颜色,比如这样的一系列灰色值

#fafafc
#f8f8f8
#f5f5f5
#efefef
#e0e0e0
#d9d9d9
#cccccc
#cbcbcb
#bfbfbf

然后要给它们由浅到深排个序,便于使用时知道加深程度,有个对比。

解决方案

将获取到的颜色统一转化为rgb格式,用公式r*0.299 + g*0.587 + b*0.114计算得到每一个颜色的灰度值,从小到大进行由浅到深的排序。

其中还要解决颜色的转化,以支持识别各类颜色。

代码

转换十六进制色值为rgb格式

function hextoRgb(color) {
  color = color.slice(1);
  var rgb = "";
  for (var i = 0; i < color.length; i += 2) {
    var end = i + 2;
    rgb += parseInt(color.slice(i, end), 16).toString() + ",";
  }
  rgb = rgb.slice(0, rgb.length - 1);
  rgb = "rgb(" + rgb + ")";
  return rgb;
}

hsl格式 转rgb

function getMid(str) {
  var left = str.indexOf("(") + 1;
  var right = str.indexOf(")");
  return str.slice(left, right);
}
//  hsl格式 转rgb
function hslToRgb(color) {
  var arr = getMid(color).split(",");
  var r, g, b;
  var h = toNum(arr[0] / 360 + ""),
    s = toNum(arr[1]),
    light = toNum(arr[2]); // h(色相) s(饱和度) l(亮度)
  var temp2, temp1;
  if (s == 0) {
    r = g = b = light;
  } else {
    temp2 = light < 0.5 ? light * (1 + s) : light + s - light * s;
    temp1 = 2 * light - temp2;

    var h2rgb = function (p, q, t) {
      if (t < 0) t += 1;
      if (t > 1) t -= 1;
      if (t < 1 / 6) return p + (q - p) * 6 * t;
      if (t < 1 / 2) return q;
      if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
      return p;
    };
    r = h2rgb(temp1, temp2, h + 1 / 3);
    g = h2rgb(temp1, temp2, h);
    b = h2rgb(temp1, temp2, h - 1 / 3);
  }
  return (
    "rgb(" +
    Math.round(r * 255) +
    "," +
    Math.round(g * 255) +
    "," +
    Math.round(b * 255) +
    ")"
  );
}
function toNum(str) {
  var rex = /[0-9]+/g;
  if (str.indexOf("%") > 0) {
    return str.match(rex)[0] / 100;
  } else {
    if (typeof +str === "number") {
      return +str;
    }
  }
}

获取颜色灰色值

function grayLevel(color) {
  color = isRgb(color)
    ? color
    : isHex(color)
    ? hextoRgb(color)
    : hslToRgb(color);
  var arr = getMid(color).split(",");
  var r = arr[0],
    g = arr[1],
    b = arr[2];
  return r * 0.299 + g * 0.587 + b * 0.114;
}

各类颜色判断

// 是否为rgb颜色值
function isRgb(color) {
  return /^rgb/.test(color);
}
// 是否为十六进制颜色值
function isHex(color) {
  return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);
}
// 是否为hsl颜色值
function isHsl(color) {
  return /^hsl/.test(color);
}

工具

小编直接做了一个颜色转换工具,方便直接使用

颜色排序

总结

主要代码也是参照网上大神来做的,小编觉得还有很多优化空间,包括各类颜色的转换,颜色的处理,颜色json的处理等。

参考

Python + Selenium 自动化测试《人生重开模拟器》

背景

最近有一款小游戏特别火,叫《人生重开模拟器》,这款游戏用黑色幽默的调侃形式,随机生成你的人生大事件列表,开场还能抽取天赋加点,趣味性十足。

因为官网访问流量过大,有的朋友出现访问白屏、网页失效的情况,小编在这里发一个最新的人生重开模拟器在线链接:

https://dushusir.com/life/

不停地重开自己的人生之后,小编想着能不能写个脚本来自动化运行这款游戏,因为是纯网页操作,所以可以使用Python和Selenium组合的自动化测试神器来测试下。

思路

因为本质上这个游戏是一系列的网页操作,所以实现起来比较简单,就当是复习下Selenium的基本元素操作。想入门Python的童鞋可以看下,

以前小编写过一个 Python+Selenium自动化测试合成大西瓜一样可以作为学习。

注意:这不是一个智能的提高游戏分数的脚本,只是一个演示自动化测试学习案例,帮助大家更好的理解selenium的用法。

开发环境

  1. 下载Python并安装
  2. 安装pip
  3. 安装Selenium和浏览器webdriver

mac平台和windows平台有所不同,安装时注意下环境。细节问题这里就不列出了,大家多用户谷歌。

如果下载Python或者pip安装比较慢的,可以参考下这篇博文进行加速。

安装py模块神器

代码

环境准备好之后,直接复制以下代码到.py文件里,比如main.py,执行
python main.py即可启动webdriver运行自动化人生重开模拟器。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 谷歌浏览器驱动
from selenium import webdriver


# sleep模块,让程序停止往下运行
from time import sleep

# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)


driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/life')

# 隐式等待
driver.implicitly_wait(5)

# 点击 立即重开
restart = driver.find_element_by_id('restart')
restart.click()

sleep(1)

# 点击 10连抽
driver.find_element_by_id('random').click()

sleep(1)

# 随机1-10数字,用于抽中天赋卡

randomOne = random.randint(1,3)
randomTwo = random.randint(4,6)
randomThree = random.randint(7,10)

# 找到三张天赋卡按钮并点击
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomOne) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomTwo) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomThree) +")").click()

# 点击确认:“请选择3个”
driver.find_element_by_css_selector("#next").click()

sleep(1)

# 点击随机分配
driver.find_element_by_css_selector("#random").click()

sleep(2)

# 开始新人生
driver.find_element_by_css_selector("#start").click()

# 持续点击人生大事件列表区域,直到列表区域内容不再增加,即表明人生结束
isOver = False # 结束标识
life = 0 # 前一个life长度

while(not isOver):

    # 点击列出人生大事件
    driver.find_element_by_css_selector("#lifeTrajectory").click()
    print('点击一次'+str(life))

    sleep(1)

    # 注意必须使用find_elements,不是find_element,否则len方法会报错
    li = driver.find_elements_by_css_selector("#lifeTrajectory li")

    currt_life = len(li)

    # 如果列表在继续增加,则继续点击;一旦不再增加,表明你挂了
    if currt_life > life:
        life = currt_life
    else:
        isOver = True
        print('结束')

# 点击人生总结
driver.find_element_by_id('summary').click()

sleep(5)
driver.quit()

总结

程序写的比较粗略,很多细节还没有完善,不过可以作为小案例参考,也欢迎大家批评指出问题。后续有时间再分享更多有用的测试脚本和好玩的游戏。

参考

《人生重开模拟器》打不开?最新链接!

游戏介绍

最近,一款小游戏火了,《人生重开模拟器》。

这款可以一玩就玩一天的“人生重开模拟器”游戏,开场先选择3张天赋,再选择初始属性,之后就随机抽取你成长的每一年的大事件,作为记录,最后形成你的人生总结。

朋友圈都在分享自己的新人生















最新地址

有朋友碰到打不开的情况,小编第一时间收到消息,重新发了一版,可能还会更新一些惊喜功能!

人生重开模拟器最新在线链接入口

https://dushusir.com/life/

总结

每个人的人生只有一次,每个人的人生都不能重来,这款小游戏以调侃的黑色幽默的形式,帮我们释放了生活的压力,回过头来看看自己的生活,很多事情你如果往好的方面想,从另一个角度考虑。其实还是有很多的美好可以看见。

  • 虽然我的工资很低,但是每个月扣掉房租,水电,交通、话费,大概还能够花,能每天吃个饱饭,慢慢努力,工资还是可以慢慢涨上来的,不怕的
  • 虽然每天挤公交挤地铁上班很难受,但是至少我们交通便利,去哪都方便
  • 虽然没有对象,但是一个人吃饱穿暖,无牵无挂,时间自由,还是一种享受
  • 虽然每天很累,但是身体健康,还能当锻炼身体了,年轻人,累点还是有好处

虐我千百遍,我待生活如初恋。

加油💪🏻

关注公众号:技术分社,获取更多小游戏
微信公众号技术分社