Selenium 无法在搜索栏上写入内容

Selenium can't swrite something on the search bar

提问人:olamundo97 提问时间:11/10/2023 更新时间:11/10/2023 访问量:41

问:

我正在使用 Selenium 和 C# 抓取一个工作网站。当我运行应用程序时,chromewebdriver 会打开,一旦它打开,网站上就会弹出一个模型,然后,程序会关闭它,但是我的程序很快就会停止执行。目的是关闭此模态 -> 在搜索栏上输入内容,然后按“Enter”。但是,我无法在搜索栏上输入某些内容,因为它给出了错误:.我应该如何解决它?Timed out after 20 secondsenter image description here

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(); //vai abrir o navegador do 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();

            // Use an explicit wait for the search input field to be clickable and then send keys
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));


            // Wait for the search input field to be clickable and then send keys
            IWebElement searchInput = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id=\"react-aria-9\"]")));

            // Send keys directly after the element is clickable
            searchInput.SendKeys("desenvolvedor");
            searchInput.SendKeys(Keys.Enter);

        }

    }
}

C# selenium-webdriver 网页抓取 selenium-chromedriver

评论

0赞 pcalkins 11/10/2023
您可以尝试/抓住等待以允许事情继续,但它告诉您它已超时,尝试使用该 XPATH 查找可点击元素。该网站也在那里抛出了很多错误......(它正在尝试通过 CSP 指令加载服务器不允许的脚本,这可能会导致以后的未经授权的请求。

答:

1赞 Yaroslavm 11/10/2023 #1

看起来你有问题,因为你依赖错误的输入。

对我来说,DOM 中存在 2 个搜索输入。 第一个是不可见的(可能是在移动视图上呈现的),第二个是可见的和可交互的。

因此,您应该通过可见性过滤带有定位器的输入,并与第一个找到的元素进行交互。[name=searchTerm]

// previous code
var searchInputs = wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.CssSelector("[name=searchTerm]")));
var visibleInput = searchInputs.FirstOrDefault(element => element.Displayed);

visibleInput?.SendKeys("desenvolvedor");
visibleInput?.SendKeys(Keys.Enter);

评论

0赞 olamundo97 11/12/2023
这是行不通的
1赞 Yaroslavm 11/12/2023
@olamundo97不可能,它不起作用。这是您的代码 + 我的代码证明它按预期工作:monosnap.com/file/xIv2x5cR4cDS2EzAbUi8KbGj1MWv6y(只要我安装了最新版本的 Selenium,我已将预期条件替换为 ExplicitWait,但这不应该是预期条件不起作用的原因)。
0赞 olamundo97 11/15/2023
谢谢,我意识到我做错了什么