Как избежать позднего связывания в этом случае? - PullRequest
0 голосов
/ 26 марта 2019

Это карманное приложение для одного класса, для одной формы, которое позволяет перейти на определенный веб-сайт, войти в систему и загрузить размещенные там файлы для нас.Все было хорошо только с поддержкой Chrome, но пользователи в нашем офисе могут использовать Chrome или Firefox, поэтому мне пришлось принять это таким образом.

Public Class Form1

    Private browser As Object

    Private Sub doLogin()
        Me.ToolStripStatusLabel1.Text = "Logging in"
        If My.Settings.UserBrowser Is BrowserChrome Then
            Dim Options = New ChromeOptions
            'Set options
            Dim driverService = ChromeDriverService.CreateDefaultService()
            driverService.HideCommandPromptWindow = True
            browser = New ChromeDriver(driverService, Options)
        Else
            Dim Options = New FirefoxOptions
            'Set options
            Dim driverService = FirefoxDriverService.CreateDefaultService()
            driverService.HideCommandPromptWindow = True
            browser = New FirefoxDriver(driverService, Options)
        End If
        browser.Url = "https://www.example.com"
        browser.Navigate()

Теперь, конечно, browser имеет позднюю привязку,но кроме дублирования кода для каждого браузера, я не знаю, как избежать позднего связывания здесь.

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Если предположить, что это Selenium, то и FirefoxDriver, и ChromeDriver имеют RemoteWebDriver в качестве своей базы, но также имеют WebDriver в качестве интерфейса.

Что действительно важно.

Интерфейс дает вам доступ к общим методам и свойствам, без необходимости знать явную версию класса, которая реализована.И интерфейсы считаются рано связанными, поскольку вызовы методов могут выполняться без необходимости поиска в списке возможных методов-кандидатов или использования System.Reflection для определения того, что класс может на самом деле делать.

Private browser As WebDriver

Private Sub doLogin()
    Me.ToolStripStatusLabel1.Text = "Logging in"
    If My.Settings.UserBrowser Is BrowserChrome Then
        Dim Options = New ChromeOptions
        'Set options
        Dim driverService = ChromeDriverService.CreateDefaultService()
        driverService.HideCommandPromptWindow = True
        browser = New ChromeDriver(driverService, Options)
    Else
        Dim Options = New FirefoxOptions
        'Set options
        Dim driverService = FirefoxDriverService.CreateDefaultService()
        driverService.HideCommandPromptWindow = True
        browser = New FirefoxDriver(driverService, Options)
    End If
    browser.Url = "https://www.example.com"
    browser.Navigate()
    ' Do other things... 
End Sub
1 голос
/ 26 марта 2019

Когда объект динамический или неизвестный, как в вашем случае, будет связываться только во время выполнения, что вы и видите. По сути, компилятор не знает, какой тип объекта или тип объекта содержит методы и свойства, поэтому он обходит проверку во время компиляции. Что вы можете сделать, это привести его к соответствующему типу ...

Private browser As Object = Nothing

Private Sub doLogin()
    Me.ToolStripStatusLabel1.Text = "Logging in"
    If My.Settings.UserBrowser Is BrowserChrome Then
        Dim Options = New ChromeOptions
        'Set options
        Dim driverService = ChromeDriverService.CreateDefaultService()
        driverService.HideCommandPromptWindow = True
        browser = New ChromeDriver(driverService, Options)
    Else
        Dim Options = New FirefoxOptions
        'Set options
        Dim driverService = FirefoxDriverService.CreateDefaultService()
        driverService.HideCommandPromptWindow = True
        browser = New FirefoxDriver(driverService, Options)
    End If

    If TypeOf browser Is ChromeDriver Then
       CType(browser, ChromeDriver).Url = "https://www.example.com"
       CType(browser, ChromeDriver).Navigate()
    ElseIf TypeOf browser Is FirefoxDriver Then
       CType(browser, FirefoxDriver).Url = "https://www.example.com"
       CType(browser, FirefoxDriver).Navigate()
    End If

End Sub

Или другая возможность ...

 CType(browser, If(TypeOf browser Is ChromeDriver, ChromeDriver, FirefoxDriver)).Url = "https://www.example.com"
 CType(browser, If(TypeOf browser Is ChromeDriver, ChromeDriver, FirefoxDriver)).Navigate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...