@@ -31,6 +31,13 @@ module Remote
31
31
class W3CBridge
32
32
include BridgeHelper
33
33
34
+ BOOLEAN_ATTRIBUTES = %i[ async autofocus autoplay checked compact complete controls
35
+ declare defaultchecked defaultselected defer disabled draggable ended
36
+ formnovalidate hidden indeterminate iscontenteditable ismap itemscope
37
+ loop multiple muted nohref noresize noshade novalidate nowrap open
38
+ paused pubdate readonly required reversed scoped seamless seeking
39
+ selected truespeed willvalidate ] . freeze
40
+
34
41
# TODO: constant shouldn't be modified in class
35
42
COMMANDS = { }
36
43
@@ -518,12 +525,37 @@ def element_tag_name(element)
518
525
execute :getElementTagName , id : element . values . first
519
526
end
520
527
528
+ # TODO - Replace implementation with atom
521
529
def element_attribute ( element , name )
522
- execute :getElementAttribute , id : element . values . first , name : name
530
+ name = name . to_sym
531
+
532
+ if name == :style
533
+ return execute_script ( "return arguments[0].style.cssText" , element )
534
+ end
535
+
536
+ if BOOLEAN_ATTRIBUTES . include? name
537
+ return execute :getElementAttribute , id : element . values . first , name : name
538
+ end
539
+
540
+ property_value = execute :getElementProperty , id : element . values . first , name : name
541
+ g return property_value if name == :value
542
+ return property_value if property_value &&
543
+ !( property_value . respond_to? ( :empty? ) && property_value . empty? )
544
+
545
+ attribute_value = execute :getElementAttribute , id : element . values . first , name : name
546
+ return nil if attribute_value . nil?
547
+
548
+ # Verify attribute not the browser default
549
+ has_attribute = execute_script ( "return arguments[0].hasAttribute(arguments[1])" , element , name )
550
+ attribute_value if has_attribute
551
+ end
552
+
553
+ def element_property ( element , name )
554
+ execute :getElementProperty , id : element . values . first , name : name
523
555
end
524
556
525
557
def element_value ( element )
526
- execute :getElementProperty , id : element . values . first , name : 'value'
558
+ element_property element , 'value'
527
559
end
528
560
529
561
def element_text ( element )
0 commit comments