当前位置: 首页 > 知识库问答 >
问题:

未找到元素硒C#

章宏恺
2023-03-14

URL:http://bcmprod.brill.com/rsuite-cms/

我正在尝试从上面的客户端站点自动下载手稿。我在C#中使用selenium phantomjs

我有用户凭据。但是,组成登录表单的元素(例如用户名、密码)在页面源中不存在,但当您在浏览器中检查这些元素时,这些元素就存在了。

这些是我用来从“检查元素”中定位它们的xpath(ID是动态分配的,这就是我没有使用它们的原因):

string xpathUsername = ".//input[@name='user']";
string xpathPassword = ".//input[@name='pass']";
string xpathBtnLogin = ".//button[@type='submit'][@aria-label='Log In']";

如果驱动程序返回的源没有登录元素,因此无法找到,但在浏览器中检查时仍然存在,那么如何成功登录?

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.IO;
using OpenQA.Selenium;
using OpenQA.Selenium.PhantomJS;
using OpenQA.Selenium.Support.UI;
using WebCrawler.Helper;

namespace WebCrawler.Webcodes
{
    class RSuite : IWebcode
    {
        List<string> errors = new List<string>();
        string xpathUsername = ".//input[@name='user']";
        string xpathPassword = ".//input[@name='pass']";
        string xpathBtnLogin = ".//button[@type='submit'][@aria-label='Log In']";

        public RSuite()
        { }

        public List<Record> GetRecords()
        {
            Console.WriteLine(string.Format("Crawling:  {0}", Config.Url));
            List<Record> recordList = new List<Record>();
            try
            {
                PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService();
                service.HideCommandPromptWindow = true;

                using (IWebDriver driver = new PhantomJSDriver(service))
                {
                    driver.Navigate().GoToUrl(Config.Url);
                    Console.WriteLine("\nChecking elements availability ...");

                    // code exception here: I couldn't get all these elements
                    IWebElement username = Element("User ID", GetElement(driver, xpathUsername));
                    IWebElement password = Element("Password", GetElement(driver, xpathPassword));
                    IWebElement btnlogin = Element("Login Button", GetElement(driver, xpathBtnLogin));

                    // input credentials
                    Console.WriteLine("\nAttempting to login ...");
                    if (username != null && password != null && btnlogin != null)
                    {
                        username.Clear();
                        username.SendKeys(Config.Username);
                        password.Clear();
                        password.SendKeys(Config.Password);

                        // is button clicked & loaded a new page? (If true, login is successful)
                        if (IsPageLoaded(driver, btnlogin))
                        {
                            Console.WriteLine("Logged in successfully.");
                            // do some action
                            // download files
                        }
                        else
                        { ErrorHandler("Login failed."); }
                    }
                    else
                    { ErrorHandler("Login failed."); }
                }
                // release
                service.Dispose();
            }
            catch (Exception err)
            { ErrorHandler(err.GetBaseException().ToString()); }

            // generate report for caught errors, if any
            if (errors.Count() > 0)
                Config.ErrorReport(this.GetType().Name.Trim().ToUpper(), string.Join("\n\n", errors));

            return recordList;
        }


        private IWebElement GetElement(IWebDriver driver, string xPath)
        {
            IWebElement element = null;
            try
            {
                // wait for elements to load
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
                Func<IWebDriver, IWebElement> waitForElement = new Func<IWebDriver, IWebElement>((IWebDriver d) =>
                {
                    element = d.FindElement(By.XPath(xPath));
                    if (element != null)
                    { return element; }
                    return null;
                });
                return wait.Until(waitForElement);
            }
            catch (Exception err)
            {
                ErrorHandler(err.GetBaseException().ToString());
                return null;
            }
        }


        private IWebElement Element(string label, IWebElement element)
        {
            if (element != null)
            { Console.WriteLine(string.Format("{0}:  Yes", label)); }
            else
            { Console.WriteLine(string.Format("{0}:  No", label)); }
            return element;
        }


        private bool IsPageLoaded(IWebDriver driver, IWebElement element)
        {
            try
            {
                // page redirected? Or is the element still attached to the DOM?
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
                element.Click();
                return wait.Until(ExpectedConditions.StalenessOf(element));
            }
            catch (Exception err)
            {
                ErrorHandler(err.GetBaseException().ToString());
                return false;
            }
        }

        private void ErrorHandler(string error)
        {
            Console.WriteLine(error);
            errors.Add(error);
        }
    }
}

共有1个答案

龙默
2023-03-14

根据您的问题,urlhttp://bcmprod.brill.com/rsuite-cms/基于余烬。因此,在查找元素时,您必须将WebDriverWait与ExpectedConditions方法相结合。

用于识别所需文件的定位器策略如下:

>

  • 用户ID:

    string username = "//input[@class='ember-view ember-text-field finput text-field component' and @name='user']";
    

    密码:

    string password = "//input[@class='ember-view ember-text-field finput text-field component' and @name='pass']";
    

    登录

    string loginbtn = "//label[@class='ui-button-text']";
    

  •  类似资料:
    • 任何提示都会很有帮助!

    • 大家好,我正试图在网站中找到一个元素,但出于某种原因,它不允许我。该网页是Reddit的登录形式,我尝试输入用户名和密码,但当我列出所有输入时,它只出现在顶部搜索栏中。我想这是因为它就像在另一个“标签”一样,它会弹出到前面,但我不知道如何管理它。提前谢谢。

    • 我将Selenium与PHP WebDriver结合使用。我试图单击导航栏中的链接,该链接显示在HTML中,如下所示: 我正在尝试选择元素,然后单击它。但是,当我尝试使用xpath时,如下所示: 或 我得到以下错误: 没有这样的元素:无法定位元素:{“method”:“xpath”,“selector”:“/*[@showpage=“cards”]”}(会话信息:chrome=70.0.3538.

    • 我试图运行下面的selenium代码,但我得到了一个异常: 封装演示; Selenium试图在单击登录名webelement之前找到webelement的电子邮件ID。请帮忙。

    • [[Img1][Img2[Img3]我试图通过链接文本获取元素。但是低于例外。异常在线程"main"org.openqa.selenium.NoSuchElement异常:没有这样的元素:无法定位元素:{"方法":"链接文本","选择器":"CFDSDSR"} 我尝试切换到帧,但它给出了未找到的帧,但该帧存在: XPath: /html/body/table/tbody/tr/td/form/ta

    • 这是代码: 这是我已经在python上尝试过的: 返回: 你知道吗?谢谢