@@ -36,6 +36,7 @@ def handle_remove_readonly(func, path, exc):
36
36
else :
37
37
raise
38
38
39
+
39
40
class Browser (object ):
40
41
__metaclass__ = ABCMeta
41
42
@@ -534,28 +535,32 @@ def _chromium_chromedriver_url(self, chrome_version):
534
535
self .chromium_platform_string (), revision , self .platform_string ())
535
536
return url
536
537
537
- def _latest_chromedriver_url (self , browser_binary = None ):
538
- chrome_version = self .version (browser_binary )
539
- assert chrome_version , "Cannot detect the version of Chrome"
538
+ def _latest_chromedriver_url (self , chrome_version ):
540
539
# Remove channel suffixes (e.g. " dev").
541
540
chrome_version = chrome_version .split (' ' )[0 ]
542
541
return (self ._official_chromedriver_url (chrome_version ) or
543
542
self ._chromium_chromedriver_url (chrome_version ))
544
543
545
- def install_webdriver (self , dest = None , channel = None , browser_binary = None ):
544
+ def install_webdriver_by_version (self , version , dest = None ):
545
+ assert version , "Cannot install ChromeDriver without Chrome version"
546
546
if dest is None :
547
547
dest = os .pwd
548
- if browser_binary is None :
549
- browser_binary = self .find_binary (channel )
550
- url = self ._latest_chromedriver_url (browser_binary )
548
+ url = self ._latest_chromedriver_url (version )
551
549
self .logger .info ("Downloading ChromeDriver from %s" % url )
552
550
unzip (get (url ).raw , dest )
553
- chromedriver_dir = os .path .join (dest , 'chromedriver_%s' % self .platform_string ())
551
+ chromedriver_dir = os .path .join (
552
+ dest , 'chromedriver_%s' % self .platform_string ())
554
553
if os .path .isfile (os .path .join (chromedriver_dir , "chromedriver" )):
555
554
shutil .move (os .path .join (chromedriver_dir , "chromedriver" ), dest )
556
555
shutil .rmtree (chromedriver_dir )
557
556
return find_executable ("chromedriver" , dest )
558
557
558
+ def install_webdriver (self , dest = None , channel = None , browser_binary = None ):
559
+ if browser_binary is None :
560
+ browser_binary = self .find_binary (channel )
561
+ return self .install_webdriver_by_version (
562
+ self .version (browser_binary ), dest )
563
+
559
564
def version (self , binary = None , webdriver_binary = None ):
560
565
if not binary :
561
566
self .logger .warning ("No browser binary provided." )
@@ -585,6 +590,9 @@ class ChromeAndroid(Browser):
585
590
product = "chrome_android"
586
591
requirements = "requirements_chrome_android.txt"
587
592
593
+ def __init__ (self , logger ):
594
+ super (ChromeAndroid , self ).__init__ (logger )
595
+
588
596
def install (self , dest = None , channel = None ):
589
597
raise NotImplementedError
590
598
@@ -596,10 +604,20 @@ def find_webdriver(self, channel=None):
596
604
597
605
def install_webdriver (self , dest = None , channel = None , browser_binary = None ):
598
606
chrome = Chrome (self .logger )
599
- return chrome .install_webdriver ( dest , channel )
607
+ return chrome .install_webdriver_by_version ( self . version (), dest )
600
608
601
609
def version (self , binary = None , webdriver_binary = None ):
602
- return None
610
+ command = ['adb' , 'shell' , 'dumpsys' , 'package' , 'com.android.chrome' ]
611
+ try :
612
+ output = call (* command )
613
+ except (subprocess .CalledProcessError , OSError ):
614
+ self .logger .warning ("Failed to call %s" % " " .join (command ))
615
+ return None
616
+ match = re .search (r'versionName=(.*)' , output )
617
+ if not match :
618
+ self .logger .warning ("Failed to find versionName" )
619
+ return None
620
+ return match .group (1 )
603
621
604
622
605
623
class ChromeiOS (Browser ):
@@ -699,6 +717,7 @@ def version(self, binary=None, webdriver_binary=None):
699
717
if m :
700
718
return m .group (0 )
701
719
720
+
702
721
class EdgeChromium (Browser ):
703
722
"""MicrosoftEdge-specific interface."""
704
723
platform = {
@@ -725,16 +744,16 @@ def find_binary(self, venv_path=None, channel=None):
725
744
os .path .expandvars ("$SYSTEMDRIVE\\ Program Files\\ Microsoft\\ Edge Dev\\ Application" ),
726
745
os .path .expandvars ("$SYSTEMDRIVE\\ Program Files (x86)\\ Microsoft\\ Edge Beta\\ Application" ),
727
746
os .path .expandvars ("$SYSTEMDRIVE\\ Program Files (x86)\\ Microsoft\\ Edge Dev\\ Application" ),
728
- os .path .expanduser ("~\\ AppData\Local\\ Microsoft\\ Edge SxS\\ Application" ), ]
747
+ os .path .expanduser ("~\\ AppData\Local\\ Microsoft\\ Edge SxS\\ Application" )]
729
748
return find_executable (binaryname , os .pathsep .join (winpaths ))
730
749
if self .platform == "macos" :
731
750
binaryname = "Microsoft Edge Canary"
732
751
binary = find_executable (binaryname )
733
752
if not binary :
734
753
macpaths = ["/Applications/Microsoft Edge.app/Contents/MacOS" ,
735
- os .path .expanduser ("~/Applications/Microsoft Edge.app/Contents/MacOS" ),
736
- "/Applications/Microsoft Edge Canary.app/Contents/MacOS" ,
737
- os .path .expanduser ("~/Applications/Microsoft Edge Canary.app/Contents/MacOS" )]
754
+ os .path .expanduser ("~/Applications/Microsoft Edge.app/Contents/MacOS" ),
755
+ "/Applications/Microsoft Edge Canary.app/Contents/MacOS" ,
756
+ os .path .expanduser ("~/Applications/Microsoft Edge Canary.app/Contents/MacOS" )]
738
757
return find_executable ("Microsoft Edge Canary" , os .pathsep .join (macpaths ))
739
758
return binary
740
759
@@ -797,6 +816,7 @@ def version(self, binary=None, webdriver_binary=None):
797
816
self .logger .warning ("Failed to find Edge binary." )
798
817
return None
799
818
819
+
800
820
class Edge (Browser ):
801
821
"""Edge-specific interface."""
802
822
0 commit comments