-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathscreenshot.rb
141 lines (120 loc) · 3.55 KB
/
screenshot.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env ruby
require 'base64'
require 'fileutils'
require 'json'
require 'open-uri'
require 'net/http'
require 'rest-client'
require 'screenshot'
require 'tmpdir'
# Ensure required environment variables are present
unless ENV['BROWSERSTACK_USERNAME'] && ENV['BROWSERSTACK_ACCESS_KEY'] && ENV['URL']
puts "Error: Required environment variables not set"
puts "Please set: BROWSERSTACK_USERNAME, BROWSERSTACK_ACCESS_KEY, URL"
exit 1
end
def generate_comment(screenshot, filename)
<<~MARKDOWN
### Screenshot from BrowserStack
**URL**: #{screenshot[:url]}
**Device**: #{screenshot[:device]} (#{screenshot[:orientation]})
**OS**: #{screenshot[:os]&.capitalize} #{screenshot[:os_version]}
**Browser**: #{screenshot[:browser]}
**Created**: #{screenshot[:created_at]}
![Screenshot](#{filename})
MARKDOWN
end
def save_locally(screenshot, image_data)
output_dir = "screenshots"
FileUtils.mkdir_p(output_dir)
# Generate filename with timestamp
timestamp = Time.now.strftime("%Y%m%d_%H%M%S")
filename = "screenshot_#{timestamp}.png"
filepath = File.join(output_dir, filename)
# Save the image
File.binwrite(filepath, image_data)
# Save the markdown
comment = generate_comment(screenshot, "./#{filename}")
comment_file = File.join(output_dir, "#{filename}.md")
File.write(comment_file, comment)
puts "Saved to:"
puts "- #{filepath}"
puts "- #{comment_file}"
end
def post_to_github(screenshot)
repo = ENV['GITHUB_REPOSITORY']
pr_number = ENV['GITHUB_PR_NUMBER']
api_url = "https://api.github.com/repos/#{repo}/issues/#{pr_number}/comments"
comment = generate_comment(screenshot, screenshot[:image_url])
puts "Posting to GitHub PR..."
response = RestClient.post(api_url,
{
body: comment
}.to_json,
{
'Authorization' => "token #{ENV['GITHUB_TOKEN']}",
'Accept' => 'application/vnd.github.v3+json',
'Content-Type' => 'application/json'
}
)
puts "Comment posted successfully!"
rescue => e
puts "Error posting to GitHub: #{e.message}"
puts e.backtrace
exit 1
end
begin
# Initialize BrowserStack client
client = Screenshot::Client.new(
:username => ENV['BROWSERSTACK_USERNAME'],
:password => ENV['BROWSERSTACK_ACCESS_KEY']
)
# Configure screenshot parameters
params = {
:url => ENV['URL'],
:wait_time => 5,
:quality => "original",
:orientation => "landscape",
:browsers => [
{
:os => "android",
:os_version => "14.0",
:browser => "Android Browser",
:device => "Samsung Galaxy Tab S10 Plus",
:browser_version => nil,
:real_mobile => true
}
]
}
puts "Taking screenshot of #{ENV['URL']}"
request_id = client.generate_screenshots(params)
puts "Screenshot requested. Request ID: #{request_id}"
puts "Waiting for screenshots to complete..."
until client.screenshots_done?(request_id)
print "."
sleep 5
end
puts "\nScreenshots completed!"
# Process screenshots
screenshots = client.screenshots(request_id)
puts JSON.pretty_generate(screenshots)
screenshots.each do |screenshot|
puts "\nProcessing screenshot..."
image_url = screenshot[:image_url]
if image_url.nil? || image_url.empty?
puts "Error: No image URL found in screenshot data"
next
end
puts "Downloading from: #{image_url}"
image_data = Net::HTTP.get(URI.parse(image_url))
save_locally(screenshot, image_data)
if ENV['GITHUB_TOKEN']
post_to_github(screenshot)
end
end
puts "\nDone!"
rescue => e
puts "Error: #{e.message}"
puts e.backtrace
exit 1
end