我正在使用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。但是我想获得通过用户输入导航的每个页面的通知。那么如何实现呢?
答案 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
再一次,我不能强调这一点,如果你正在寻找一个意味着"页面被加载的事件,"你做错了。正确的做法是确定目标页面上将存在的一些元素,并等待该元素可用。