0

I'm currently creating a script that requires to verify certain button colors. I can't see any procedures/actions that I can use to verify button colors for swing application.

Is it possible to get JButton color using Javascript or Python script?

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Liyo
  • 19
  • 2
  • 7
  • You can even create your own checker. An example on how this can be done, can be found here - https://www.qfs.de/en/blog/article/2019/04/16/writing-your-own-checkers.html - which funnily does nearly the thing you want to do. The only difference is that the checker is checking the foreground color, not the background color. Shouldn't be difficult to rewrite the checker so that it checks the background color instead. If I have some time later today, I may post a solution. – quant Feb 18 '21 at 17:18

2 Answers2

2

Ok, here is a script that adds a corresponding checker. It also knows a "few" more color names (thanks to cindyxiaoxiaoli, see https://stackoverflow.com/a/20670056/3009636 for his color name list) ...

from de.qfs.apps.qftest.extensions.checks import CheckerRegistry, \
    Checker, DefaultCheckType, CheckDataType
from de.qfs.apps.qftest.shared.data.check import StringCheckData
from de.qfs.lib.util import Pair
import jarray

componentClass = "java.awt.Component"
backgroundColorCheckerType = DefaultCheckType("BackgroundColor", CheckDataType.STRING, "Background color")

colorList = {
    (0xF0, 0xF8, 0xFF) : "AliceBlue",
    (0xFA, 0xEB, 0xD7) : "AntiqueWhite",
    (0x00, 0xFF, 0xFF) : "Aqua",
    (0x7F, 0xFF, 0xD4) : "Aquamarine",
    (0xF0, 0xFF, 0xFF) : "Azure",
    (0xF5, 0xF5, 0xDC) : "Beige",
    (0xFF, 0xE4, 0xC4) : "Bisque",
    (0x00, 0x00, 0x00) : "Black",
    (0xFF, 0xEB, 0xCD) : "BlanchedAlmond",
    (0x00, 0x00, 0xFF) : "Blue",
    (0x8A, 0x2B, 0xE2) : "BlueViolet",
    (0xA5, 0x2A, 0x2A) : "Brown",
    (0xDE, 0xB8, 0x87) : "BurlyWood",
    (0x5F, 0x9E, 0xA0) : "CadetBlue",
    (0x7F, 0xFF, 0x00) : "Chartreuse",
    (0xD2, 0x69, 0x1E) : "Chocolate",
    (0xFF, 0x7F, 0x50) : "Coral",
    (0x64, 0x95, 0xED) : "CornflowerBlue",
    (0xFF, 0xF8, 0xDC) : "Cornsilk",
    (0xDC, 0x14, 0x3C) : "Crimson",
    (0x00, 0xFF, 0xFF) : "Cyan",
    (0x00, 0x00, 0x8B) : "DarkBlue",
    (0x00, 0x8B, 0x8B) : "DarkCyan",
    (0xB8, 0x86, 0x0B) : "DarkGoldenRod",
    (0xA9, 0xA9, 0xA9) : "DarkGray",
    (0x00, 0x64, 0x00) : "DarkGreen",
    (0xBD, 0xB7, 0x6B) : "DarkKhaki",
    (0x8B, 0x00, 0x8B) : "DarkMagenta",
    (0x55, 0x6B, 0x2F) : "DarkOliveGreen",
    (0xFF, 0x8C, 0x00) : "DarkOrange",
    (0x99, 0x32, 0xCC) : "DarkOrchid",
    (0x8B, 0x00, 0x00) : "DarkRed",
    (0xE9, 0x96, 0x7A) : "DarkSalmon",
    (0x8F, 0xBC, 0x8F) : "DarkSeaGreen",
    (0x48, 0x3D, 0x8B) : "DarkSlateBlue",
    (0x2F, 0x4F, 0x4F) : "DarkSlateGray",
    (0x00, 0xCE, 0xD1) : "DarkTurquoise",
    (0x94, 0x00, 0xD3) : "DarkViolet",
    (0xFF, 0x14, 0x93) : "DeepPink",
    (0x00, 0xBF, 0xFF) : "DeepSkyBlue",
    (0x69, 0x69, 0x69) : "DimGray",
    (0x1E, 0x90, 0xFF) : "DodgerBlue",
    (0xB2, 0x22, 0x22) : "FireBrick",
    (0xFF, 0xFA, 0xF0) : "FloralWhite",
    (0x22, 0x8B, 0x22) : "ForestGreen",
    (0xFF, 0x00, 0xFF) : "Fuchsia",
    (0xDC, 0xDC, 0xDC) : "Gainsboro",
    (0xF8, 0xF8, 0xFF) : "GhostWhite",
    (0xFF, 0xD7, 0x00) : "Gold",
    (0xDA, 0xA5, 0x20) : "GoldenRod",
    (0x80, 0x80, 0x80) : "Gray",
    (0x00, 0x80, 0x00) : "Green",
    (0xAD, 0xFF, 0x2F) : "GreenYellow",
    (0xF0, 0xFF, 0xF0) : "HoneyDew",
    (0xFF, 0x69, 0xB4) : "HotPink",
    (0xCD, 0x5C, 0x5C) : "IndianRed",
    (0x4B, 0x00, 0x82) : "Indigo",
    (0xFF, 0xFF, 0xF0) : "Ivory",
    (0xF0, 0xE6, 0x8C) : "Khaki",
    (0xE6, 0xE6, 0xFA) : "Lavender",
    (0xFF, 0xF0, 0xF5) : "LavenderBlush",
    (0x7C, 0xFC, 0x00) : "LawnGreen",
    (0xFF, 0xFA, 0xCD) : "LemonChiffon",
    (0xAD, 0xD8, 0xE6) : "LightBlue",
    (0xF0, 0x80, 0x80) : "LightCoral",
    (0xE0, 0xFF, 0xFF) : "LightCyan",
    (0xFA, 0xFA, 0xD2) : "LightGoldenRodYellow",
    (0xD3, 0xD3, 0xD3) : "LightGray",
    (0x90, 0xEE, 0x90) : "LightGreen",
    (0xFF, 0xB6, 0xC1) : "LightPink",
    (0xFF, 0xA0, 0x7A) : "LightSalmon",
    (0x20, 0xB2, 0xAA) : "LightSeaGreen",
    (0x87, 0xCE, 0xFA) : "LightSkyBlue",
    (0x77, 0x88, 0x99) : "LightSlateGray",
    (0xB0, 0xC4, 0xDE) : "LightSteelBlue",
    (0xFF, 0xFF, 0xE0) : "LightYellow",
    (0x00, 0xFF, 0x00) : "Lime",
    (0x32, 0xCD, 0x32) : "LimeGreen",
    (0xFA, 0xF0, 0xE6) : "Linen",
    (0xFF, 0x00, 0xFF) : "Magenta",
    (0x80, 0x00, 0x00) : "Maroon",
    (0x66, 0xCD, 0xAA) : "MediumAquaMarine",
    (0x00, 0x00, 0xCD) : "MediumBlue",
    (0xBA, 0x55, 0xD3) : "MediumOrchid",
    (0x93, 0x70, 0xDB) : "MediumPurple",
    (0x3C, 0xB3, 0x71) : "MediumSeaGreen",
    (0x7B, 0x68, 0xEE) : "MediumSlateBlue",
    (0x00, 0xFA, 0x9A) : "MediumSpringGreen",
    (0x48, 0xD1, 0xCC) : "MediumTurquoise",
    (0xC7, 0x15, 0x85) : "MediumVioletRed",
    (0x19, 0x19, 0x70) : "MidnightBlue",
    (0xF5, 0xFF, 0xFA) : "MintCream",
    (0xFF, 0xE4, 0xE1) : "MistyRose",
    (0xFF, 0xE4, 0xB5) : "Moccasin",
    (0xFF, 0xDE, 0xAD) : "NavajoWhite",
    (0x00, 0x00, 0x80) : "Navy",
    (0xFD, 0xF5, 0xE6) : "OldLace",
    (0x80, 0x80, 0x00) : "Olive",
    (0x6B, 0x8E, 0x23) : "OliveDrab",
    (0xFF, 0xA5, 0x00) : "Orange",
    (0xFF, 0x45, 0x00) : "OrangeRed",
    (0xDA, 0x70, 0xD6) : "Orchid",
    (0xEE, 0xE8, 0xAA) : "PaleGoldenRod",
    (0x98, 0xFB, 0x98) : "PaleGreen",
    (0xAF, 0xEE, 0xEE) : "PaleTurquoise",
    (0xDB, 0x70, 0x93) : "PaleVioletRed",
    (0xFF, 0xEF, 0xD5) : "PapayaWhip",
    (0xFF, 0xDA, 0xB9) : "PeachPuff",
    (0xCD, 0x85, 0x3F) : "Peru",
    (0xFF, 0xC0, 0xCB) : "Pink",
    (0xDD, 0xA0, 0xDD) : "Plum",
    (0xB0, 0xE0, 0xE6) : "PowderBlue",
    (0x80, 0x00, 0x80) : "Purple",
    (0xFF, 0x00, 0x00) : "Red",
    (0xBC, 0x8F, 0x8F) : "RosyBrown",
    (0x41, 0x69, 0xE1) : "RoyalBlue",
    (0x8B, 0x45, 0x13) : "SaddleBrown",
    (0xFA, 0x80, 0x72) : "Salmon",
    (0xF4, 0xA4, 0x60) : "SandyBrown",
    (0x2E, 0x8B, 0x57) : "SeaGreen",
    (0xFF, 0xF5, 0xEE) : "SeaShell",
    (0xA0, 0x52, 0x2D) : "Sienna",
    (0xC0, 0xC0, 0xC0) : "Silver",
    (0x87, 0xCE, 0xEB) : "SkyBlue",
    (0x6A, 0x5A, 0xCD) : "SlateBlue",
    (0x70, 0x80, 0x90) : "SlateGray",
    (0xFF, 0xFA, 0xFA) : "Snow",
    (0x00, 0xFF, 0x7F) : "SpringGreen",
    (0x46, 0x82, 0xB4) : "SteelBlue",
    (0xD2, 0xB4, 0x8C) : "Tan",
    (0x00, 0x80, 0x80) : "Teal",
    (0xD8, 0xBF, 0xD8) : "Thistle",
    (0xFF, 0x63, 0x47) : "Tomato",
    (0x40, 0xE0, 0xD0) : "Turquoise",
    (0xEE, 0x82, 0xEE) : "Violet",
    (0xF5, 0xDE, 0xB3) : "Wheat",
    (0xFF, 0xFF, 0xFF) : "White",
    (0xF5, 0xF5, 0xF5) : "WhiteSmoke",
    (0xFF, 0xFF, 0x00) : "Yellow",
    (0x9A, 0xCD, 0x32) : "YellowGreen"
}

def getNearestColor(r, g, b):
    nearest = (0x00, 0x00, 0x00)
    diff = r + g + b
    for key in colorList:
        newDiff = abs(r - key[0]) + abs(g - key[1]) + abs(b - key[2])
        if newDiff < diff:
            diff, nearest = newDiff, key
    return colorList.get(nearest)

def rgbToColorName(c):
    a, r, g, b = c.getAlpha(), c.getRed(), c.getGreen(), c.getBlue()
    if a == 0: return "transparent"
    if (r, g, b) in colorList:
        s = colorList.get((r, g, b))
    else:
        s = "nearly %s" % getNearestColor(r, g, b)
    if a != 255:
        s = s + " with a bit of transparency"
    return s

class BackgroundColorChecker(Checker):
    def getSupportedCheckTypes(self, com, item):
        return jarray.array([backgroundColorCheckerType], DefaultCheckType)

    def getCheckData(self, com, item, checkType):
        if backgroundColorCheckerType.getIdentifier() == checkType.getIdentifier():
            color = rgbToColorName(com.getBackground())
            return StringCheckData(checkType.getIdentifier(), color)
        return None

    def getCheckDataAndItem(self, com, item, checkType):
        data = self.getCheckData(com, item, checkType)
        if data == None: return None
        return Pair(data, None)

global backgroundColorCheck

# unregister a maybe already present instance of this checker
try: CheckerRegistry.instance().unregisterChecker(componentClass, backgroundColorCheck)
except: pass

# after unregistering, register a new instance of this checker
backgroundColorCheck = BackgroundColorChecker()
CheckerRegistry.instance().registerChecker(componentClass, backgroundColorCheck)

After running this script you can then record the corresponding color check

Recorded check

quant
  • 2,184
  • 2
  • 19
  • 29
1

thanks to @quant, i was able to create a script for this posting it for reference

ColorList = {
"java.awt.Color[r=211,g=211,b=211]": "GRAY",
"java.awt.Color[r=255,g=0,b=0]": "RED",
"java.awt.Color[r=255,g=255,b=0]": "YELLOW",
"java.awt.Color[r=255,g=255,b=102]": "LYELLOW",
"java.awt.Color[r=0,g=255,b=0]": "GREEN"
}

com = rc.getComponent("$(Component)")
RGBcolor = com.getBackground()
foundcolor = ColorList.get(str(RGBcolor))
rc.checkEqual(foundcolor, "$(expectedcolor)", "Check Color")
print (foundcolor)
Liyo
  • 19
  • 2
  • 7
  • That's a good solution, but "java.awt.Color[r=1,g=255,b=0]" would also be "green" for most humans ;) If you do it like this, you may want to convert rgb to hsv/hsl color space and then check for the nearest color. See for example https://stackoverflow.com/questions/4126029/convert-rgb-values-to-color-name – quant Feb 22 '21 at 19:29