带镀铬的Selenium显示镀铬驱动程序的控制台窗口,获取页面完整事件

时间:2014-08-04 06:01:50

标签: vb.net google-chrome selenium

我正在使用Selenium进行Chrome浏览器自动化。我想打开一个网页并填写登录表单,提交等。 以下是代码的一部分

    Dim chromeOptions As New OpenQA.Selenium.Chrome.ChromeOptions()
    chromeOptions.AddExcludedArgument("ignore-certifcate-errors")
    chromeOptions.AddArgument("test-type")
    Dim driver As IWebDriver = New ChromeDriver(chromeOptions)
    driver.Navigate().GoToUrl("https://example.com")


    Dim myLink1 As IWebElement = driver.FindElement(By.Name("userName"))
    myLink1.SendKeys("username")
    Dim myLink2 As IWebElement = driver.FindElement(By.Name("password"))
    myLink2.SendKeys("mypassword")

它运作正常。但是当我运行应用程序时,Chrome打开时会出现一个控制台窗口。这是由于chromedriver.exe和cond = sole windows显示“在端口2078上启动ChromeDriver(v2.9.248315)”。但我不希望这个控制台窗口出现,因为用户起诉应用程序将不需要它并理解它是什么。所以有什么方法可以避免这个控制台窗口?

一旦页面完全加载,我怎样才能获得页面完成事件?

修改

类似于可用于网络浏览器控件的Document complete。在阅读了selenium文档之后,我发现存在EventFiringWebDriver可以做我想要的(如OnNavigated)并且chromeDriver没有这些。但我没有得到任何关于它(EventFiringWebDriver)如何与Onnavigated函数等一起使用来获取这些事件的例子。

修改

我做的是

Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome
Imports OpenQA.Selenium.Support.Events

Dim service As ChromeDriverService = ChromeDriverService.CreateDefaultService
Dim driver1 As ChromeDriver = Nothing
Dim driver As EventFiringWebDriver
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim chromeOptions As New OpenQA.Selenium.Chrome.ChromeOptions()
        chromeOptions.AddExcludedArgument("ignore-certifcate-errors")
        chromeOptions.AddArgument("test-type")
        service.HideCommandPromptWindow = True
        driver1 = New ChromeDriver(service, chromeOptions)
        driver = New EventFiringWebDriver(driver1)
        AddHandler driver.Navigated, AddressOf OnNavigated
        driver.Navigate().GoToUrl("https://example.com")
        Dim myLink1 As IWebElement = driver.FindElement(By.Name("userName"))
        myLink1.SendKeys("username")
        Dim myLink2 As IWebElement = driver.FindElement(By.Name("password"))
        myLink2.SendKeys("mypassword")
    End Sub
    Protected Sub OnNavigated(ByVal sender As Object, ByVal e As Support.Events.WebDriverNavigationEventArgs)
        MessageBox.Show("Page navaigated  " & e.Url)
    End Sub

End Class

页面导航后OnNavigated函数按我的预期触发。但是在页面被导航并且用户名和密码填满后,如果用户手动点击登录按钮,登录后将出现一个新页面。在这个新页面被导航的过程中,它不会触发OnNavigated。但是我想获得通过用户输入导航的每个页面的通知。那么如何实现呢?

1 个答案:

答案 0 :(得分:3)

显示命令提示符窗口的默认行为是一个功能,而不是错误。许多人坚持使用.Close()方法退出浏览器窗口而不是.Quit()。但是,这会关闭浏览器,但不会清除所有资源,例如退出chromedriver.exe实例。因此,.NET绑定维护者做出了有意识的决定,使其在可执行文件运行时以及何时不能完全清楚。您可以使用类似于以下内容的代码更改此行为:

Dim service As OpenQA.Selenium.Chrome.ChromeDriverService = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService()
service.HideCommandPromptWindow = True

Dim chromeOptions As New OpenQA.Selenium.Chrome.ChromeOptions()
chromeOptions.AddExcludedArgument("ignore-certifcate-errors")
chromeOptions.AddArgument("test-type")
Dim driver As IWebDriver = New ChromeDriver(service, chromeOptions)

一般认为在StackOverflow上的一个帖子中提出多个不相关的问题是不好的形式,但至于你的第二个问题,你问,"我怎么知道什么时候使用完全加载页面的webdriver&#34?;如果是这样,那么答案是,"你不会。"或者,更准确地说,当您谈论当今JavaScript重,支持AJAX,动态生成的DOM世界时,这个问题毫无意义。

如果您需要确保页面上存在元素,然后才能与其进行交互,则可以等待该条件。支持库(在.NET中的WebDriver.Support.dll程序集中)包含一个WebDriverWait类,旨在实现这一目标。

您还可以尝试使用EventFiringWebDriver,其中包含Navigated个事件。您可以使用标准的VB.NET事件处理代码将其挂钩(AddHandler / RemoveHandler)。但是, 不要 将此.NET绑定事件与从Internet Explorer的COM对象接收的事件类型(如DocumentComplete event)混淆。 WebDriver API中不存在此类构造。 Navigated事件仅在您手动导航到页面时引发(即,不会导致导致导航的元素点击),并且无法保证在Navigated时触发任何特定DOM事件事件被提出。使用它的代码看起来像这样:

' Assumes you have a sub with a declaration like this:
' Private Sub Navigated(sender As Object, e As WebDriverNavigationEventArgs)
Dim driver As IWebDriver = New ChromeDriver(service, chromeOptions)
Dim eventDriver As New EventFiringWebDriver(driver)
AddHandler eventDriver.Navigated, AddressOf Navigated

再一次,我不能强调这一点,如果你正在寻找一个意味着"页面被加载的事件,"你做错了。正确的做法是确定目标页面上将存在的一些元素,并等待该元素可用。