mass-client 1.0.36 → 1.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17ab03b7d1207db0db356b9a38e8e9d5fa856d9f71e03346c3bd6311adce456d
4
- data.tar.gz: 401387d1d220a7ec8e974fc2c4ffbe5b3cac0ed7a3292c5f9adbd31f3290e1b1
3
+ metadata.gz: 79a458ee1f713c73e4567171dc2df8fe348612f4acb64b46987d9efbd941ee5c
4
+ data.tar.gz: 5cdd47bfa69af7dafd52681b64fdd4609d3d3a2c03804dcb20ac7459af2de959
5
5
  SHA512:
6
- metadata.gz: 36a6ccbfb8655086004038eeaa66a25e2af7000dab93662030b8f7886a407d2a021bf38d0a7eb4d87a6a8c42d4b271a389c0ec77705690633472fa545faca002
7
- data.tar.gz: 4bd941cc2b784b69f66163a03909f1925f3c1e711716be1b55aa778eb543d9ed4a3b6bf61bc06d4ddd099c0c2cbf70d2f7f460597e7d5575a88ddf57f7627ff4
6
+ metadata.gz: 40bc64016ace0f97d2a8b6b3b48c85c67cfce7039f6852301be029d2a8a9ba565c6a2520bec6b5b4139a37bcc1c6ba61e24bc0d9444a2e2b36406764e2c11242
7
+ data.tar.gz: 8d07063dd8c65e0a8a6831b3303ac953ddcb9e70f426259e0edb8f332b47b2e4728d755908a7fd94e241c5021a2c3a056a6745b427944384bb3f26b8fc1f0cde
@@ -87,27 +87,43 @@ module Mass
87
87
 
88
88
  # scroll down the page until N event elements are showed up
89
89
  def show_up_event_elements(job:, event_limit:, max_scrolls:, take_screenshots: false, logger:nil)
90
- l = logger || BlackStack::DummyLogger.new(nil)
91
- driver = job.profile.driver
92
- # scroll down
93
- i = 0
94
- prev_n_events = 0
95
- security_height = 150
96
- lis = self.event_elements(job: job)
97
- n_events = lis.size
98
- while (i<max_scrolls || n_events>prev_n_events) && n_events<event_limit
90
+ l = logger || BlackStack::DummyLogger.new(nil)
91
+ driver = job.profile.driver
92
+ # scroll down
93
+ i = 0
94
+ prev_n_events = 0
95
+ security_height = 150
96
+ lis = self.event_elements(job: job)
97
+ n_events = lis.size
98
+ while (i<max_scrolls || n_events>prev_n_events) && n_events<event_limit
99
99
  i += 1
100
100
 
101
101
  prev_n_events = n_events
102
102
  lis = self.event_elements(job: job)
103
103
  n_events = lis.size
104
-
105
- # scroll down the exact height of the viewport
104
+
105
+ # scroll down the exact height of the viewport or the feed container
106
106
  # reference: https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions
107
107
  l.logs "Scrolling down (#{i.to_s.blue}/#{max_scrolls.to_s.blue} - #{n_events.to_s.blue}/#{event_limit.to_s.blue} events showed up)... "
108
108
  step = self.desc['scrolling_step'] + rand(self.desc['scrolling_step_random'].to_i)
109
+
110
+ # old DOM
109
111
  driver.execute_script("window.scrollTo(0, #{i.to_s}*#{step})")
110
- #driver.execute_script("window.scrollTo(0, #{i.to_s}*(Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0)-#{security_height}))")
112
+
113
+ # new DOM
114
+ # Use a more robust script: compute a rounded pixel amount and try to scroll
115
+ # the main/feed container first (typical for SPA like LinkedIn). Fall back to
116
+ # document.scrollingElement or window if necessary.
117
+ script = <<~JS
118
+ var amount = Math.round(#{i} * #{step});
119
+ var el = document.querySelector('main') || document.querySelector('div[role="main"]') || document.querySelector('div[aria-label="Feed"]') || document.scrollingElement || document.documentElement || document.body;
120
+ if (el && typeof el.scrollTo === 'function') {
121
+ el.scrollTo(0, amount);
122
+ } else {
123
+ window.scrollTo(0, amount);
124
+ }
125
+ JS
126
+ driver.execute_script(script)
111
127
  sleep(5)
112
128
  l.logf "done".green
113
129
 
@@ -122,7 +138,11 @@ module Mass
122
138
  else
123
139
  l.no
124
140
  end
125
- end
141
+ end # while
142
+ # If we exited because we reached the maximum number of scrolls
143
+ if i >= max_scrolls && n_events < event_limit
144
+ raise "Maximum scrolls (#{max_scrolls}) reached. Only #{n_events} events found."
145
+ end
126
146
  end
127
147
 
128
148
  # Return a hash desriptor of the events found.
@@ -279,7 +279,33 @@ module Mass
279
279
  headless: headless,
280
280
  read_timeout: read_timeout
281
281
  )
282
- self.class.buffer_driver.manage.window.resize_to(self.desc['browser_width'], self.desc['browser_height'])
282
+
283
+ # this exception-catch is because of the glitch: https://github.com/massprospecting/hub/issues/20
284
+ begin
285
+ self.class.buffer_driver.manage.window.resize_to(self.desc['browser_width'], self.desc['browser_height'])
286
+ rescue Errno::ECONNREFUSED,
287
+ Selenium::WebDriver::Error::InvalidSessionIdError,
288
+ Selenium::WebDriver::Error::NoSuchWindowError,
289
+ Selenium::WebDriver::Error::WebDriverError => e
290
+
291
+ # preferred: ask AdsPower to stop the remote browser session
292
+ begin
293
+ c.stop(self.desc['ads_power_id'])
294
+ rescue => stop_err
295
+ #warn "client.stop failed: #{stop_err.class}: #{stop_err.message}"
296
+ # fallback: best-effort local cleanup of cached driver object
297
+ AdsPowerClient.cleanup(self.desc['ads_power_id'])
298
+ end
299
+
300
+ # let sockets/ports free
301
+ sleep 1
302
+
303
+ # re-attach / re-create driver and retry once
304
+ driver = c.driver2(self.desc['ads_power_id'], headless: false)
305
+
306
+ self.class.buffer_driver.manage.window.resize_to(self.desc['browser_width'], self.desc['browser_height'])
307
+ end
308
+
283
309
  self.one_tab
284
310
 
285
311
  #if self.desc['allow_browser_to_download_multiple_files']
@@ -294,7 +320,6 @@ module Mass
294
320
  js1 = Net::HTTP.get(uri)
295
321
  #l.logf "done".green
296
322
 
297
-
298
323
  # call ls command to get array of files in the folder
299
324
  # iterate all the *.js files inside the folder $RUBYLIB/extensions/mass.subaccount/js
300
325
  js2 = ''
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mass-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.36
4
+ version: 1.0.38
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leandro Daniel Sardi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-19 00:00:00.000000000 Z
11
+ date: 2025-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: timeout
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 1.0.14
145
+ version: 1.0.19
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 1.0.14
152
+ version: 1.0.19
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: aws-sdk-s3
155
155
  requirement: !ruby/object:Gem::Requirement