在C#中使用Selenium对网页进行网页搜索启用Javascript的网站

时间:2018-04-04 13:10:35

标签: javascript c# selenium selenium-webdriver web-scraping

我试图刮字典,字典网页就是这样:

  • 有一个搜索框,用于输入要查找的单词

  • 有一个按钮,因此在输入单词后,您必须单击它以查看结果

  • 问题是网站是使用JavaScript设计的,这意味着当我点击Go按钮时,网页网址不会改变,只有div内的内容发生变化,{{1 }}

  • 请注意,点击“转到”按钮后,搜索框内容将通过JavaScript使用post方法发布到服务器。

这是我目前的代码:

<div id="dict_entry">content of the entry for the given word goes here</div>

上面代码的问题是,当我导航到using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (var driver = new ChromeDriver()) { driver.Navigate().GoToUrl("http://www.mydictionary.com/dictionary"); var searchField = driver.FindElementById("search"); var searchButton = driver.FindElementByXPath("//*[@id=\"search_submit\"]"); searchField.SendKeys("writer"); searchButton.Click(); var result = driver.FindElementByXPath("//*[@id=\"dict_entry\"]").Text; File.WriteAllText("result.txt", result); } } } } 时,字典会加载默认的第一个条目,即条目http://mydictionary.com/dictionary的条目,我试图获取单词条目:a但我的代码获取了单词writer的内容,因为它不会等待表单提交到服务器并在抓取网页之前获得其响应。由于网页是一个JavaScript驱动的网页,我怎样才能确保我的JavaScript表单帖子的响应已经返回,以便在获得新的JavaScript操作DOM后我将其删除?

换句话说:在webscraping之前,如何通过JavaScript等待新创建的DOM?

3 个答案:

答案 0 :(得分:0)

是否可以在Clear()

之前尝试使用SendKeys()方法
searchField.Clear();
searchField.SendKeys("writer");

答案 1 :(得分:0)

使用下面的代码显式等待Web元素

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("id")));

然后得到结果。

答案 2 :(得分:0)

我发现这个等待jquery完成的解决方案似乎正在运行:

while (true) // Handle timeout somewhere
    {
        var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
        if (ajaxIsComplete)
            break;
        Thread.Sleep(100);
    }

https://sqa.stackexchange.com/a/2733