使用Selenium(C#)爬取Gupy网站时搜索框输入超时问题求助
问题描述
使用Selenium结合C#爬取招聘网站Gupy时,ChromeDriver启动后网站弹出弹窗,关闭弹窗后程序操作搜索框时出现“Timed out after 20 seconds”错误,无法输入内容。需求是关闭弹窗后在搜索框输入内容并按下回车键。
代码示例
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JobWebScraper { public class AutomationWeb { public IWebDriver driver; public AutomationWeb() { var options = new ChromeOptions(); options.AddArgument("no-sandbox"); driver = new ChromeDriver(); //打开Chrome浏览器 } public void TestWeb() { driver.Navigate().GoToUrl("https://portal.gupy.io/?int_ref=navbar-candidatos"); driver.FindElement(By.XPath("//*[@id=\"radix-0\"]/div[2]/button")).Click(); // 使用显式等待等待搜索输入框可点击后输入内容 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); // 等待搜索输入框可点击后输入内容 IWebElement searchInput = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id=\"react-aria-9\"]"))); // 元素可点击后直接输入 searchInput.SendKeys("desenvolvedor"); searchInput.SendKeys(Keys.Enter); } } }
网站界面截图

解决方案
1. 替换不稳定的元素定位器
你使用的react-aria-9是动态生成的ID,页面加载或刷新后会变化,导致定位失败。建议改用稳定的定位方式:
- 优先通过
placeholder属性定位:By.CssSelector("input[placeholder='Buscar vagas, empresas ou palavras-chave']") - 或通过父容器结合标签定位:
By.CssSelector("div[role='search'] input")
2. 优化弹窗关闭逻辑
关闭弹窗前先等待按钮可点击,关闭后等待弹窗完全消失,避免遮挡后续元素:
// 等待关闭按钮可点击 IWebElement closeBtn = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id=\"radix-0\"]/div[2]/button"))); closeBtn.Click(); // 等待弹窗消失 wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath("//*[@id=\"radix-0\"]")));
3. 强化显式等待条件
同时验证元素的可见性和可编辑状态,确保元素完全加载完成:
IWebElement searchInput = wait.Until(driver => { var element = driver.FindElement(By.CssSelector("input[placeholder='Buscar vagas, empresas ou palavras-chave']")); return element.Displayed && element.Enabled; });
4. 添加页面加载完成等待
在打开URL后,等待页面DOM加载完成再执行后续操作:
driver.Navigate().GoToUrl("https://portal.gupy.io/?int_ref=navbar-candidatos"); wait.Until(driver => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
完整修改后的代码
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; namespace JobWebScraper { public class AutomationWeb { public IWebDriver driver; private WebDriverWait wait; public AutomationWeb() { var options = new ChromeOptions(); options.AddArgument("no-sandbox"); driver = new ChromeDriver(); wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); //延长等待时间到30秒 } public void TestWeb() { driver.Navigate().GoToUrl("https://portal.gupy.io/?int_ref=navbar-candidatos"); // 等待页面加载完成 wait.Until(driver => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete")); // 等待弹窗关闭按钮可点击并关闭 IWebElement closeBtn = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id=\"radix-0\"]/div[2]/button"))); closeBtn.Click(); // 等待弹窗消失 wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath("//*[@id=\"radix-0\"]"))); // 定位搜索框(用稳定的CSS选择器) IWebElement searchInput = wait.Until(driver => { var element = driver.FindElement(By.CssSelector("input[placeholder='Buscar vagas, empresas ou palavras-chave']")); return element.Displayed && element.Enabled; }); // 输入内容并回车 searchInput.SendKeys("desenvolvedor"); searchInput.SendKeys(Keys.Enter); } } }
内容的提问来源于stack exchange,提问作者olamundo97
相关产品推荐
相关产品推荐

