GVKun编程网logo

选择器无效:不允许使用Selenium的复合类名称错误(选择器不可用)

13

在这里,我们将给大家分享关于选择器无效:不允许使用Selenium的复合类名称错误的知识,让您更了解选择器不可用的本质,同时也会涉及到如何更有效地AngularJSGoogleOauth400错误re

在这里,我们将给大家分享关于选择器无效:不允许使用Selenium的复合类名称错误的知识,让您更了解选择器不可用的本质,同时也会涉及到如何更有效地AngularJS Google Oauth 400错误redirect_uri的参数值无效:不允许使用片段、c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、C#使用Selenium的实现代码、Flask错误:“不允许使用方法所请求的URL不允许使用该方法”的内容。

本文目录一览:

选择器无效:不允许使用Selenium的复合类名称错误(选择器不可用)

选择器无效:不允许使用Selenium的复合类名称错误(选择器不可用)

我正在尝试通过webWhatsapp从聊天中打印我的消息之一。

我可以通过“控制台”选项卡中的Javascript完成此操作

recived_msg = document.getElementsByClassName(''XELVh selectable-text invisible-space copyable-text'') // returns an array of the chatrecived_msg[5].innerText // shows me the 4th message content

问题是我试图在python上做同样的事情,但对我不起作用。

这是我尝试过的:

from selenium import webdriverrecived_msg = driver.find_element_by_class_name(''XELVh selectable-text invisible-space copyable-text'')final = recived_msg[5].innerText #doesnt work for some reason

我收到的错误是:消息:无效的选择器:不允许使用复合类名

我对javascript有点陌生,所以很抱歉造成误会,并感谢您的帮助!:)

答案1

小编典典

根据
selenium.webdriver.common.by 实施文档:

class selenium.webdriver.common.by.By    Set of supported locator strategies.    CLASS_NAME = ''class name''

所以,

  • 使用find_element_by_class_name()您将无法传递多个类名。传递多个类,您将面临以下错误:

    Message: invalid selector: Compound class names not permitted
  • 另外,由于要返回聊天数组,因此find_element*您无需使用 find_elements*


或者,您可以使用以下两种定位策略之一:

  • CSS_SELECTOR

    recived_msg = driver.find_elements_by_css_selector(".XELVh.selectable-text.invisible-space.copyable-text")
  • XPATH

    recived_msg = driver.find_elements_by_xpath("//*[@XELVh selectable-text invisible-space copyable-text'']")

AngularJS Google Oauth 400错误redirect_uri的参数值无效:不允许使用片段

AngularJS Google Oauth 400错误redirect_uri的参数值无效:不允许使用片段

我正在使用Kinvey在我的AngularJS应用程序上处理Oauth,它适用于Facebook,但是当我尝试使用Google登录时,我收到400错误:

错误:invalid_request

redirect_uri的参数值无效:不允许使用片段:localhost:9000 /#/ login

有没有人遇到过Google Oauth和Angular这个问题?关于如何绕过它的任何想法?该问题源于Angular路由的URL中的哈希值.

解决方法

#被称为片段标识符.错误片段不允许:表示您必须将#替换为替代,例如:

> localhost:9000 / route / login

然后与Kinvey重定向:

req.request({uri: 'http://localhost:9000/route/login',method: 'GET'},function(error,response,body){
  response.statusCode = 302; 
  response.setHeader("Location","/#/login");
  response.end();
  }
);

以下是一些与类似问题无关的问题:

> Redirect to different page url in Node.js (Not in express or other frameworks)
> Redirecting client with NodeJS and Restify
> URI encoding in Yahoo mail compose link
> URL fragment missing from redirect URI
> Why URI-encoded (‘#’) anchors cause 404,and how to deal with it in JS?

c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?

c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?

我之前使用IWebDriver控制IE进行测试.但是IWebDriver和IWebElement支持的方法非常有限.我发现属于Selenium命名空间的ISelenium / DefaultSelenium非常有用.如何在不安装Selenium Server的情况下使用它们来控制IE?

这是DefaultSelenium的构造函数:

ISelenium sele = new DefaultSelenium(**serveraddr**,**serverport**,browser,url2test);
sele.Start();
sele.open();
...

似乎我必须在创建ISelenium对象之前安装Selenium Server.

我的情况是,我正在尝试使用C#Selenium构建一个.exe应用程序,它可以在不同的PC上运行,并且不可能在所有PC上安装Selenium Server(你永远不知道哪个是下一个运行应用程序).

有没有人知道如何在不安装服务器的情况下使用ISelenium / DefaultSelenium?
谢谢!

解决方法

在不使用RC Server的情况下,Java中有一些解决方案:

1)对于selenium浏览器启动:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setbrowserName("safari");
CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"),new URL("http://www.google.com/"),capabilities);
WebDriver driver = new RemoteWebDriver(executor,capabilities);

2)对于selenium命令:

// You may use any WebDriver implementation. Firefox is used here as an example
WebDriver driver = new FirefoxDriver();

// A "base url",used by selenium to resolve relative URLs
 String baseUrl = "http://www.google.com";

// Create the Selenium implementation
Selenium selenium = new WebDriverBackedSelenium(driver,baseUrl);

// Perform actions with selenium
selenium.open("http://www.google.com");
selenium.type("name=q","cheese");
selenium.click("name=btnG");

// Get the underlying WebDriver implementation back. This will refer to the
// same WebDriver instance as the "driver" variable above.
WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver();

//Finally,close the browser. Call stop on the WebDriverBackedSelenium instance
//instead of calling driver.quit(). Otherwise,the JVM will continue running after
//the browser has been closed.
selenium.stop();

描述于此:http://seleniumhq.org/docs/03_webdriver.html

谷歌在C#中有类似的东西.没有其他方法可以实现这一目标.

C#使用Selenium的实现代码

C#使用Selenium的实现代码

介绍:

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码 ,做到可见即可爬。

所以Selenium现在被广泛用于Python爬虫。查了下资料,发现这个工具确实强大,最重要的是,C#也是可以调用的。

官方支持Java,C#,Python,Ruby,PHP,Perl,Javascript等语言

Selenium使用Java开发,项目地址https://github.com/SeleniumHQ/selenium

使用Selenium:

1、我们新建一个C#控制台程序

2、使用Nuget搜索以下依赖库

需要引用的核心库是Selenium.RC,Selenium.Support,Selenium.WebDriver

然后再需要引用 浏览器驱动库,这里我以IE浏览器为例,Chrome使用方式跟IE是一样的,程序包名称为Selenium.WebDriver.ChromeDriver。

3、在Main函数中输入以下代码

static void Main(string[] args)
    {
      using (IWebDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver())
      {
        driver.Navigate().GoToUrl("http://www.baidu.com"); //driver.Url = "http://www.baidu.com"是一样的

        var source = driver.PageSource;

        Console.WriteLine(source);
      }
    }

运行,会弹出IE浏览器,网页加载完成后,浏览器会自动关闭。控制台输入结果如下

这样我们就可以轻松的获取动态渲染页面的源码。

基本用法:

这里我以https://technet-info.com/Main.aspx这个页面来演示。

页面源码如下

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="description" content="Wandering the number of windows, stayed in the number of hotels, will feel that separation is not wronged, the feelings are used to browse or used to collect, so that the day had a memorable day" /><title>
  Welcome To Technet-Info : Personal Gallery
</title><link rel="shortcut icon" type="image/x-icon" href="technet.ico" rel="external nofollow" media="screen" /><link rel="stylesheet" href="Css/MainCss.css" rel="external nofollow" /><link rel="stylesheet" href="Css/screen.css" rel="external nofollow" />
  <style>
    #footer{
      display: flex;
      justify-content: center;
      align-items: center;
      position: fixed;
      bottom: 0;
      left: 0;
      width: 100%;
    }
  </style>
  <script type="text/javascript" src="js/jquery.js"></script>
  <script type="text/javascript" src="js/easySlider1.7.js"></script>  
  <script type="text/javascript">
    $(document).ready(function () {
      $("#slider").easySlider({
        auto: true,
        pause:3000,
        continuous: true,
        numeric: true
      });
    });   
  </script>
</head>
<body>
  <form method="post" action="./Main.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTQyNjI2MTkwNmRkt331eyucv2SBluj0E2d+0haGV4exFHWtGQkZhNBnpHE=" />
</div>

<div>

  <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="202EA31B" />
</div>
    <div id="main">
      <div id="header">
        <div>
          
          <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=150 height=52 src="http://music.163.com/outchain/player?type=0&id=516657278&auto=1&height=32"></iframe>
        </div>
        <div>
          
          <div>
            
            <div>
              <div></div>
            </div>
            
            <div>
              <div>
                <p></p>
              </div>
              <div>
                <p>我的freetime</p>
              </div>
            </div>
          </div>


          
          <div>
            
        </div>
      </div>
      
      <div id="content">
        
        
        </div>
                
        <div id="cards">
            
          </div>
        <div id="pin">
          
        </div>

      </div>
      
      <div id="footer">
        <div id="copyright">
          <p>
            <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" >湘ICP备16012349号</a>
            <span>|</span>
            <span>Copyright © 2016, www.technet-info.com, All rights reserved.</span>
          </p>
          <p><a href="mailto:zhaotianff@163.com" rel="external nofollow" >Email:zhaotianff@163.com</a></p>
        </div>
      </div>
    </div>
  </form>
</body>
</html>

通过id获取元素

//by id
var byID = driver.FindElement(By.Id("cards"));

通过类名获取元素

//by class name
var byClassName = driver.FindElements(By.ClassName("menu"));

通过标签名获取元素

//by tag name 
var byTagName = driver.FindElement(By.TagName("iframe"));

通过名字获取元素

var byName = driver.FindElement(By.Name("__VIEWSTATE"));

通过链接文本获取元素

//by linked text 
//<a href="http://www.google.com" rel="external nofollow" rel="external nofollow" >linkedtext</a>> 
var byLinkText = driver.FindElement(By.LinkText("linkedtext"));

通过部分链接文本获取元素

//by partial link text
//<a href="http://www.google.com" rel="external nofollow" rel="external nofollow" >linkedtext</a>>
var byPartialLinkText = driver.FindElement(By.PartialLinkText("text"));

通过CSS选择器获取元素

//by css
var byCss = driver.FindElement(By.CssSelector("#header .content .logo"));

通过XPath来获取元素(XPath使用可以参考上一篇博客)

//by xpath
var byXPath = driver.FindElements(By.XPath("//div"));

执行JS

//execute javascript
var jsReturnValue = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("jsfunname");

获取元素的值和属性

//get element value and attribute value
var byIDText = byID.Text;
var byIDAttributeText = byID.GetAttribute("id");

模拟鼠标点击元素

//click
driver.FindElement(By.Id("copyright")).Click();

页面导航

//Navigation
driver.Navigate().Forward();
driver.Navigate().Back();

拖拽操作(可以实现滑动验证码的验证)

//Drag And Drop
var element = driver.FindElement(By.Name("source"));
IWebElement target = driver.FindElement(By.Name("target"));
(new Actions(driver)).DragAndDrop(element, target).Perform();

示例代码

到此这篇关于C#使用Selenium的实现代码的文章就介绍到这了,更多相关C#使用Selenium内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • 用C#+Selenium+ChromeDriver爬取网页(模拟真实的用户浏览行为)
  • c# Selenium爬取数据时防止webdriver封爬虫的方法
  • c# 从内存中释放Selenium chromedriver.exe
  • C# 利用Selenium实现浏览器自动化操作的示例代码
  • C#使用Selenium+PhantomJS抓取数据
  • C#使用selenium实现爬虫

Flask错误:“不允许使用方法所请求的URL不允许使用该方法”

Flask错误:“不允许使用方法所请求的URL不允许使用该方法”

每当我尝试将数据提交到Flask表单时,都会出现以下错误:

Method Not Allowed The method is not allowed for the requested URL.

我认为问题出在return redirect(url_for(''database''))我正在做。我也尝试returnrender_template(''database.html)过。表单项提交到数据库后,我正在尝试调用数据库页面。

我的代码的相关部分如下:

@app.route(''/entry'', methods=[''GET'', ''POST''])def entry_page():    if request.method == ''POST'':        date = request.form[''date'']        title = request.form[''blog_title'']        post = request.form[''blog_main'']        post_entry = models.BlogPost(date = date, title = title, post = post)        db.session.add(post_entry)        db.session.commit()        return redirect(url_for(''database''))    else:        return render_template(''entry.html'')@app.route(''/database'')        def database():    query = []    for i in session.query(models.BlogPost):        query.append((i.title, i.post, i.date))    return render_template(''database.html'', query = query)

entry.html是…

THIS IS THE BLOG ENTRY PAGEblog:<html>    <form action=''/database'' method = "post">        date<input name = "date" type = "text">        title<input name = "blog_title" type = "text">        main<input name = "blog_main" type = "text">        <input type = "submit">    </form> </html>

和database.html …

THIS IS THE QUERY:{{query}}

答案1

小编典典

这里发生的是数据库路由不接受任何url方法。

我会尝试将url方法放在应用程序路由中,就像在entry_page函数中一样:

@app.route(''/entry'', methods=[''GET'', ''POST''])def entry_page():    if request.method == ''POST'':        date = request.form[''date'']        title = request.form[''blog_title'']        post = request.form[''blog_main'']        post_entry = models.BlogPost(date = date, title = title, post = post)        db.session.add(post_entry)        db.session.commit()        return redirect(url_for(''database''))    else:        return render_template(''entry.html'')@app.route(''/database'', methods=[''GET'', ''POST''])        def database():    query = []    for i in session.query(models.BlogPost):        query.append((i.title, i.post, i.date))    return render_template(''database.html'', query = query)

关于选择器无效:不允许使用Selenium的复合类名称错误选择器不可用的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于AngularJS Google Oauth 400错误redirect_uri的参数值无效:不允许使用片段、c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、C#使用Selenium的实现代码、Flask错误:“不允许使用方法所请求的URL不允许使用该方法”的相关信息,请在本站寻找。

本文标签: