本文将带您了解关于不允许使用selenium化合物类名称的新内容,同时我们还将为您解释不允许使用类型名是什么意思的相关知识,另外,我们还将为您提供关于c#–是否可以在不安装SeleniumServer
本文将带您了解关于不允许使用selenium化合物类名称的新内容,同时我们还将为您解释不允许使用类型名是什么意思的相关知识,另外,我们还将为您提供关于c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、C#使用Selenium、Flask错误:“不允许使用方法所请求的URL不允许使用该方法”、Python selenium —— 一定要会用selenium的等待,三种等待方式解读的实用信息。
本文目录一览:- 不允许使用selenium化合物类名称(不允许使用类型名是什么意思)
- c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
- C#使用Selenium
- Flask错误:“不允许使用方法所请求的URL不允许使用该方法”
- Python selenium —— 一定要会用selenium的等待,三种等待方式解读
不允许使用selenium化合物类名称(不允许使用类型名是什么意思)
我有下面的代码,单击一个元素以弹出一个屏幕并在其中复制文本
el1 = driver.find_element_by_id("keyDev-A")el1.click()el2 = driver.find_element_by_class_name("content")print(el2.text)
但是,当我尝试selenium
单击该弹出窗口中的按钮时,
el3 = driver.find_element(By.CLASS_NAME, "action-btn cancel alert-display")el3.click()
它产生一条错误消息: invalid selector: Compound class names not permitted
这是我selenium
要单击的HTML 。该Close
按钮。
<div> <span>Confirm</span> <span>Cancel</span> <span>Close</span></div>
我应该怎么写el3
才能单击关闭按钮?
答案1
小编典典Leon的评论提出了正确的信息,即不再支持复合类名称。相反,您可以尝试使用CSS选择器。就您而言,以下代码行应帮助您获取所需的元素:
el3 = driver.find_element_by_css_selector(".action-btn.cancel.alert-display")
它在class属性中找到具有所有三个类(action-btn,cancel和alert-display)的元素。请注意,类的顺序在这里无关紧要,任何类都可以出现在class属性的任何位置。只要元素具有所有三个类,就将其选中。如果您希望固定类的顺序,则可以使用以下xpath:
el3 = driver.find_element_by_xpath("//*[@action-btn cancel alert-display'']")
c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
这是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?
谢谢!
解决方法
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
介绍:
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函数中输入以下代码
1 static void Main(string[] args)
2 {
3 using (IWebDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver())
4 {
5 driver.Navigate().GoToUrl("http://www.baidu.com"); //driver.Url = "http://www.baidu.com"是一样的
6
7 var source = driver.PageSource;
8
9 Console.WriteLine(source);
10 }
11 }
运行,会弹出IE浏览器,网页加载完成后,浏览器会自动关闭。控制台输入结果如下
这样我们就可以轻松的获取动态渲染页面的源码。
基本用法:
这里我以https://technet-info.com/Main.aspx这个页面来演示。
页面源码如下
1 <!DOCTYPE html>
2
3 <html xmlns="http://www.w3.org/1999/xhtml">
4 <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>
5 Welcome To Technet-Info : Personal Gallery
6 </title><link rel="shortcut icon" type="image/x-icon" href="technet.ico" media="screen" /><link rel="stylesheet" href="Css/MainCss.css" /><link rel="stylesheet" href="Css/screen.css" />
7 <style>
8 #footer{
9 display: flex;
10 justify-content: center;
11 align-items: center;
12 position: fixed;
13 bottom: 0;
14 left: 0;
15 width: 100%;
16 }
17 </style>
18 <script type="text/javascript" src="js/jquery.js"></script>
19 <script type="text/javascript" src="js/easySlider1.7.js"></script>
20 <script type="text/javascript">
21 $(document).ready(function () {
22 $("#slider").easySlider({
23 auto: true,
24 pause:3000,
25 continuous: true,
26 numeric: true
27 });
28 });
29 </script>
30 </head>
31 <body>
32 <form method="post" action="./Main.aspx" id="form1">
33 <div class="aspNetHidden">
34 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTQyNjI2MTkwNmRkt331eyucv2SBluj0E2d+0haGV4exFHWtGQkZhNBnpHE=" />
35 </div>
36
37 <div class="aspNetHidden">
38
39 <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="202EA31B" />
40 </div>
41 <div id="main">
42 <div id="header">
43 <div class="musicarea">
44
45 <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>
46 </div>
47 <div class="content">
48
49 <div class="logo">
50
51 <div class="logo_img">
52 <div class="logo_img"></div>
53 </div>
54
55 <div class="logo_txt">
56 <div style="height: 50px;">
57 <p></p>
58 </div>
59 <div style="height: 50px;">
60 <p>我的freetime</p>
61 </div>
62 </div>
63 </div>
64
65
66
67 <div class="menu">
68
69 </div>
70 </div>
71
72 <div id="content">
73
74
75 </div>
76
77 <div id="cards">
78
79 </div>
80 <div id="pin">
81
82 </div>
83
84 </div>
85
86 <div id="footer">
87 <div id="copyright">
88 <p style="margin: 3px">
89 <a href="http://www.miitbeian.gov.cn/">湘ICP备16012349号</a>
90 <span>|</span>
91 <span>Copyright © 2016, www.technet-info.com, All rights reserved.</span>
92 </p>
93 <p><a href="mailto:zhaotianff@163.com">Email:zhaotianff@163.com</a></p>
94 </div>
95 </div>
96 </div>
97 </form>
98 </body>
99 </html>
通过id获取元素
1 //by id
2 var byID = driver.FindElement(By.Id("cards"));
通过类名获取元素
1 //by class name
2 var byClassName = driver.FindElements(By.ClassName("menu"));
通过标签名获取元素
1 //by tag name
2 var byTagName = driver.FindElement(By.TagName("iframe"));
通过名字获取元素
1 var byName = driver.FindElement(By.Name("__VIEWSTATE"));
通过链接文本获取元素
1 //by linked text
2 //<a href="http://www.google.com">linkedtext</a>>
3 var byLinkText = driver.FindElement(By.LinkText("linkedtext"));
通过部分链接文本获取元素
1 //by partial link text
2 //<a href="http://www.google.com">linkedtext</a>>
3 var byPartialLinkText = driver.FindElement(By.PartialLinkText("text"));
通过CSS选择器获取元素
1 //by css
2 var byCss = driver.FindElement(By.CssSelector("#header .content .logo"));
通过XPath来获取元素(XPath使用可以参考上一篇博客)
1 //by xpath
2 var byXPath = driver.FindElements(By.XPath("//div"));
执行JS
1 //execute javascript
2 var jsReturnValue = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("jsfunname");
获取元素的值和属性
1 //get element value and attribute value
2 var byIDText = byID.Text;
3 var byIDAttributeText = byID.GetAttribute("id");
模拟鼠标点击元素
1 //click
2 driver.FindElement(By.Id("copyright")).Click();
页面导航
1 //Navigation
2 driver.Navigate().Forward();
3 driver.Navigate().Back();
拖拽操作(可以实现滑动验证码的验证)
1 //Drag And Drop
2 var element = driver.FindElement(By.Name("source"));
3 IWebElement target = driver.FindElement(By.Name("target"));
4 (new Actions(driver)).DragAndDrop(element, target).Perform();
示例代码
Flask错误:“不允许使用方法所请求的URL不允许使用该方法”
每当我尝试将数据提交到Flask表单时,都会出现以下错误:
Method Not Allowed The method is not allowed for the requested URL.
我认为问题出在return redirect(url_for('database'))
我正在做。我也尝试return
render_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 PAGE
blog:
<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}}
Python selenium —— 一定要会用selenium的等待,三种等待方式解读
发现太多人不会用等待了,博主今天实在是忍不住要给大家讲讲等待的必要性。
很多人在群里问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待。殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么量级的,就好比闪电侠和凹凸曼约好去打怪兽,然后闪电侠打完回来之后问凹凸曼你为啥还在穿鞋没出门?凹凸曼分分中内心一万只羊驼飞过,欺负哥速度慢,哥不跟你玩了,抛个异常撂挑子了。
那么怎么才能照顾到凹凸曼缓慢的加载速度呢?只有一个办法,那就是等喽。说到等,又有三种等法,且听博主一一道来:
1. 强制等待
第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间。
看代码:
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get(''https://huilansame.github.io'')
sleep(3) # 强制等待3秒再执行下一步
print driver.current_url
driver.quit()
1
2
3
4
5
6
7
8
9
10
11
这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。
2. 隐性等待
第二种办法叫隐性等待,implicitly_wait(xx),隐性等待的意义是:闪电侠和凹凸曼约定好,不论闪电侠去哪儿,都要等凹凸曼xx秒,如果凹凸曼在这段时间内来了,则俩人立即出发去打怪兽,如果凹凸曼在规定时间内没到,则闪电侠自己去,那自然就等着凹凸曼给你抛异常吧。
看代码:
# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(30) # 隐性等待,最长等30秒
driver.get(''https://huilansame.github.io'')
print driver.current_url
driver.quit()
1
2
3
4
5
6
7
8
9
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?有办法,这就要看selenium提供的另一种等待方式——显性等待wait了。
需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要设置一次即可,我曾看到有人把隐性等待当成了sleep在用,走哪儿都来一下…
3. 显性等待
第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
先看个代码示例:
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.implicitly_wait(10) # 隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者
driver.get(''https://huilansame.github.io'')
locator = (By.LINK_TEXT, ''CSDN'')
try:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
print driver.find_element_by_link_text(''CSDN'').get_attribute(''href'')
finally:
driver.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上例中,我们设置了隐性等待和显性等待,在其他操作中,隐性等待起决定性作用,在WebDriverWait..中显性等待起主要作用,但要注意的是:最长的等待时间取决于两者之间的大者,此例中为20,如果隐性等待时间 > 显性等待时间,则该句代码的最长等待时间等于隐性等待时间。
我们主要用到了WebDriverWait类与expected_conditions模块,下面博主带大家细看一下这两个模块:
WebDriverWait
wait模块的WebDriverWait类是显性等待类,先看下它有哪些参数与方法:
selenium.webdriver.support.wait.WebDriverWait(类)
1
__init__
driver: 传入WebDriver实例,即我们上例中的driver
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,
则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
1
2
3
4
5
until
method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
1
2
until_not
与until相反,until是当某元素出现或什么条件成立则继续执行,
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。
1
2
看了以上内容基本上很清楚了,调用方法如下:
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
1
这里需要特别注意的是until或until_not中的可执行方法method参数,很多人传入了WebElement对象,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id(''kw'')) # 错误
1
这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 __call__() 方法,否则会抛出异常:
TypeError: ''xxx'' object is not callable
1
在这里,你可以用selenium提供的 expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、is_selected() 方法,或者用自己封装的方法都可以,那么接下来我们看一下selenium提供的条件有哪些:
expected_conditions
expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:
selenium.webdriver.support.expected_conditions(模块)
1
以下两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
title_is
title_contains
以下两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw’)
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
presence_of_element_located
presence_of_all_elements_located
以下三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的
visibility_of_element_located
invisibility_of_element_located
visibility_of
以下两个条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
以下条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
以下条件判断是否有alert出现
alert_is_present
以下条件判断元素是否可点击,传入locator
element_to_be_clickable
以下四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入locator以及状态,相等返回True,否则返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of
上面是所有17个condition,与until、until_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。
今天关于不允许使用selenium化合物类名称和不允许使用类型名是什么意思的分享就到这里,希望大家有所收获,若想了解更多关于c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、C#使用Selenium、Flask错误:“不允许使用方法所请求的URL不允许使用该方法”、Python selenium —— 一定要会用selenium的等待,三种等待方式解读等相关知识,可以在本站进行查询。
本文标签: