有没有更快的方法用Selenium C#填写输入表格

时间:2018-07-01 18:09:37

标签: c# selenium selenium-webdriver selenium-chromedriver

我在C#中使用Selenium Webdriver自动填充输入表单并使用SendKeys();。方法,但是填写输入表单需要花费很长时间。我想知道是否有一种方法可以一次填充所有输入表单,或者是否有比SendKeys()更快的一次填充它们的方法?方法。我本质上是想尽快填写表格。我将不胜感激。

我的代码示例:

//name
chromeDriver.FindElementByXPath("//*[@id='order_billing_name']").SendKeys("John Doe");

//email
chromeDriver.FindElementByXPath("//*[@id='order_email']").SendKeys("Johndoe@gmail.com");

//telephone
chromeDriver.FindElementByXPath("//*[@id='order_tel']").SendKeys("123-456-7890");

3 个答案:

答案 0 :(得分:2)

如果您只是在网上抓取数据,则可以执行javascript来做到这一点,并且它在理论上应该是最快的。这样的事情应该起作用。

JavascriptExecutor js = (JavascriptExecutor)chromeDriver;   

js.executeScript(@"document.getElementById('order_billing_name').value = 'John Doe';");

如果您实际使用它进行测试,则可以使用“ find_element_by_id”调用代替使用id的“ find_element_by_xpath”调用来节省一些时间。根据浏览器的不同,速度可能会快很多。所以这些都可以。

chromeDriver.FindElement(By.Id("order_billing_name")).SendKeys("John Doe");
chromeDriver.FindElementById("order_billing_name").SendKeys("John Doe");

答案 1 :(得分:0)

我猜您的屏幕上有太多元素。那会减慢搜索算法的速度。

您如何首先找到要发送密钥的字段的表单,然后在表单中搜索元素?这样,您将丢弃表单之外的所有其他元素,因此应提高性能。

类似这样的东西:

    WebElement form = chromeDriver.FindElementById("my-form")

    //name
    form.FindElementByXPath("//*[@id='order_billing_name']").SendKeys("John Doe");

    //email
    form.FindElementByXPath("//*[@id='order_email']").SendKeys("Johndoe@gmail.com");

    //telephone
    form.FindElementByXPath("//*[@id='order_tel']").SendKeys("123-456-7890");

答案 2 :(得分:0)

kodingkuma告诉您,一种更快的使用JavaScriptExecutor的方法 但这也取决于webPage的结构。 我认为一个好的方法可能是: 在“ google”上搜索什么是找到WebElement的最快方法(使用“硒最快的方式查找元素”,您会找到很多示例)。

I.E。一些结果:

Which is the best and fastest way to find the element using webdriver? By.XPath or By.ID or anything else? And why? [closed]

What is the fastest and slowest ways of finding elements using Selenium Webdriver?

Which is the Best and Fastest Way to Find Elements Using Selenium WebDriver

然后,构建一些不同的过程并测量需要加载的时间。

(我认为这是一种查找元素的好方法,它最初会检查您所需的元素是否在列表('ul'或'ol')中列出('li'),并在可能的情况下实例化一个list(Of IWebElements);然后循环其中的每个WebElement)

这里有个例子:

Dim jsExec As OpenQA.Selenium.IJavaScriptExecutor
jsExec = CType(driver, OpenQA.Selenium.IJavaScriptExecutor)
Dim sw As New Stopwatch
Dim MyListOfWebElements As System.Collections.ObjectModel.ReadOnlyCollection(Of IWebElement)

Public Sub Selenium_Load_WebElements_By_JsExecutor()
    sw.Restart()
    MyListOfWebElements = jsExec.ExecuteScript("var result = document.querySelector('...here you put your css selector...'); if(result === null) {} else {result = result.querySelectorAll('li')}; return result;")
    sw.Stop()
    MsgBox("WebElement List (jsExec-css) - Loading time (ms): " & sw.ElapsedMilliseconds)
End Sub

Public Sub Selenium_Load_WebElements_By_Css()
    sw.Restart()
    MyListOfWebElements = Driver.driver.FindElements(By.CssSelector("...your css selector...")).ToList
    sw.Stop()
    MsgBox("WebElement List (Css) - Loading time (ms): " & sw.ElapsedMilliseconds)
End Sub

Public Sub Selenium_Load_WebElements_By_Id()
    sw.Restart()
    MyListOfWebElements = Driver.driver.FindElements(By.Id("...your id...")).ToList
    sw.Stop()
    MsgBox("WebElement List (Id) - Loading time (ms): " & sw.ElapsedMilliseconds)
End Sub

P.S。请注意,要使用javaScriptExecutor,您需要在“ ...”之间使用Javascript语法。