最近很多小伙伴都在问selenium视口中元素的验证和selenium中验证点这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展c#–是否可以在不安装SeleniumServer的情
最近很多小伙伴都在问selenium视口中元素的验证和selenium中验证点这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、py+selenium拼图式拖动滑块的验证、Python+Selenium+Unittest 框架使用 ——Selenium—— 定位元素(二)、python+selenium+unnitest 写一个完整的登陆的验证等相关知识,下面开始了哦!
本文目录一览:- selenium视口中元素的验证(selenium中验证点)
- c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?
- py+selenium拼图式拖动滑块的验证
- Python+Selenium+Unittest 框架使用 ——Selenium—— 定位元素(二)
- python+selenium+unnitest 写一个完整的登陆的验证
selenium视口中元素的验证(selenium中验证点)
如何使用selenium验证元素是否在视口中可见(浏览器的可见性)?
我尝试使用下面的代码,但是Point对象(Y值)由于页面可滚动而返回巨大的值。这是获取元素尺寸,浏览器的位置和尺寸并进行比较。
Dimension weD = element.getSize(); //to get the element DimensionsPoint weP = element.getLocation(); // getting the location of the element in the page.Dimension d = driver.manage().window().getSize(); // To get the browser dimensionsint x = d.getWidth(); //browser widthint y = d.getHeight(); //browser heightint x2 = weD.getWidth() + ewp.getX();int y2 = weD.getHeight() + ewp.getY();return x2 <= x && y2 <= y;
如果有人为此工作,请您分享解决方案?
答案1
小编典典无法直接通过API进行操作,因此您必须使用脚本注入。
确定元素在视口中是否可见的最佳方法是使用document.elementFromPoint将元素放置在假定的位置。如果它不在视口和您的元素中,则返回null;如果它不在其子元素中,则返回null。
public static Boolean isVisibleInViewport(WebElement element) { WebDriver driver = ((RemoteWebElement)element).getWrappedDriver(); return (Boolean)((JavascriptExecutor)driver).executeScript( "var elem = arguments[0], " + " box = elem.getBoundingClientRect(), " + " cx = box.left + box.width / 2, " + " cy = box.top + box.height / 2, " + " e = document.elementFromPoint(cx, cy); " + "for (; e; e = e.parentElement) { " + " if (e === elem) " + " return true; " + "} " + "return false; " , element);}
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#中有类似的东西.没有其他方法可以实现这一目标.
py+selenium拼图式拖动滑块的验证
我这边是前端提供了随机生成缺口的位置,只适合部分人
先定位到需要移动的滑块位置,
应为我这边随机生成的缺口位置是display:none无法获取元素所以要先修改成block才能读取
这里有一个坑就是如果你直接移动该元素的话他无法读取到你移动的位置的,你要先点击该滑块触发后才能获取到你要移动的距离
下面贴上代码:
time.sleep(5)
# 定位到滑块位置
a = obtener_elemeentos("login", "滑块位置", 1)
b = obtener_elemeentos("login", "滑块位置", 2)
slider = login.browser.find_element(a,b)
# 修改display为block
js =obtener_elemeentos("login", "缺口js", 2)
# 执行
login.browser.execute_script(js)
# 读取随即后生产的距离
time.sleep(1)
c=obtener_elemeentos("login", "缺口距离", 1)
d = obtener_elemeentos("login", "缺口距离", 2)
distance = login.browser.find_element(c,d).text
print(distance)
while isElementExist(a,b):
time.sleep(2)
distance = login.browser.find_element(c, d).text
print(distance)
# 按住鼠标不动
login.Action.click_and_hold(slider).perform()
# 拖动到坐标后然后松手
login.Action.drag_and_drop_by_offset(slider, int(distance), 0).perform()
本人是读取的是excel里面的参数,你们要把obtener_elemeentos这个函数改一下,写的比较菜欢迎大佬指点
Python+Selenium+Unittest 框架使用 ——Selenium—— 定位元素(二)
1、定位元素(id、name、class、link、partial link)
(1)find_element_by_id()
用百度定位测试,用 firebug 查看定位元素 ,输入框的 id 为 “kw”,【百度一下】按钮的 id 为 “su”。
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("python") #输入框输入“python”
driver.find_element_by_id("su").click() #点击【百度一下】按钮
(2)find_element_by_name()
用百度定位测试,用 firebug 查看定位元素 ,输入框的 name 为 “wd”,【百度一下】按钮没有 name 属性,这里用 id 定位,id 为 “su”。
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_name("wd").send_keys("python") #输入框输入“python”
driver.find_element_by_id("su").click() #点击【百度一下】按钮
(3)find_element_by_class_name()
百度的 class 属性值是包含空格,用 class 无法定位百度。这里我改用 bing 搜索为测试实例,用 firebug 查看定位元素 ,输入框的 class 为 “b_searchbox”,搜索按钮的 class 为 “”b_searchboxSubmit“”
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://cn.bing.com/")
driver.find_element_by_class_name("b_searchbox").send_keys("python") #输入框输入“python”
driver.find_element_by_class_name("b_searchboxSubmit").click() #点击【百度一下】按钮
(4)find_element_by_link_text()
find_element_by_link_text () 是根据链接的文本来定位。以百度为定位测试,找百度页面 “新闻” 这个元素
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_link_text("新闻").click() #打开新闻链接
(5)find_element_by_partial_link_text()
find_element_by_partial_link_text () 是根据链接的文本包含某个字符来定位。以百度为定位测试,找百度页面 “新闻” 中的 “闻”:
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_partial_link_text("闻").click() #打开新闻链接
2、xpath 定位元素
(1)通过绝对路径定位。一般很少用这种绝对路径定位,除非其他定位元素无法准确定位,才会用到。
用百度定位测试,用 firebug 和 firepath 查看定位元素 ,输入框的绝对路径为 “html/body/div [1]/div [1]/div/div [1]/div/form/span [1]”,【百度一下】按钮的绝对路径为 “html/body/div [1]/div [1]/div/div [1]/div/form/span [2]/input”。
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_xpath("html/body/div[1]/div[1]/div/div[1]/div/form/span[1]").send_keys("python") #输入框输入“python”
driver.find_element_by_xpath("html/body/div[1]/div[1]/div/div[1]/div/form/span[2]/input").click()
通过以上代码去执行,找不到输入框位置。是因为输入框定位位置不准确。firebug 和 firepath 只是辅助工具,有时会出错,需要更新手动定位。
所以输入框的绝对路径为 “html/body/div [1]/div [1]/div/div [1]/div/form/span [1]/input”,【百度一下】按钮的绝对路径为 “html/body/div [1]/div [1]/div/div [1]/div/form/span [2]/input”。
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_xpath("html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input").send_keys("python") #输入框输入“python”
driver.find_element_by_xpath("html/body/div[1]/div[1]/div/div[1]/div/form/span[2]/input").click()
(2)简化 xpath
WebDriver ELement Locator 定位神器,可以快速定位。点鼠标右键
a. 通过元素属性进行定位 - id
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_xpath("//input[@id=''kw'']").send_keys("python") #输入框输入“python”
driver.find_element_by_xpath("//input[@id=''su'']").click() #点击【百度一下】按钮
b. 通过元素属性进行定位 - name
from selenium import webdriver #导入selenium的webdriver包
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_xpath("//input[@name=''wd'']").send_keys("python") #输入框输入“python”
driver.find_element_by_xpath("//input[@id=''su'']").click() #点击【百度一下】按钮
还有很多定位没有讲,掌握以上定位可以满足工作需求,不需要大家全部掌握。后续我会再补充。
python+selenium+unnitest 写一个完整的登陆的验证
1 import unittest
2 from selenium import webdriver
3 from time import sleep
4
5 class lonInTest (unittest.TestCase):
6 @classmethod
7 def setUp(self):
8 self.driver = webdriver.Firefox()
9 self.driver.implicitly_wait(30)
10 def test_login_sucess(self):
11 self.login("XXXXX","XXXXXXX")
12 sleep(3)
13 logoutName = self.driver.find_element_by_class_name("menu-link-label")
14 self.assertTrue(''修改密码'' in logoutName.text)
15
16 def login(self, username, password):
17 self.driver.get("http:XXXXXXXXXX")
18 input_field = self.driver.find_element_by_name("username")
19 input_field.clear()
20 input_field.send_keys(username)
21
22 input_password = self.driver.find_element_by_name("password")
23 input_password.clear()
24 input_password.send_keys(password)
25
26 login = self.driver.find_element_by_tag_name("button")
27 login.click()
28
29 def tearDown(self):
30 self.driver.quit()
31
32 unittest.main()
作为一个刚开学习 python+selenium+unnitest 的小白人员,说一下我写这段代码遇到的问题吧
问题:运行程序就报 TypeError: test_login () missing 2 required positional arguments: ''username'' and ''password''
后来经过种种排查发现:login 函数之前的 test 去掉就可以了,因为 login 是内部调用的函数,test 开头的是每一条用例
def test_login_sucess(self):
self.test_login("XXXXXX","XXXXXX")
sleep(3)
logoutName = self.driver.find_element_by_class_name("menu-link-label")
self.assertTrue('' 修改密码 '' in logoutName.text)
def test_login(self, username, password):
self.driver.get("XXXXXXXXXXXXX")
input_field = self.driver.find_element_by_name("username")
input_field.clear()
input_field.send_keys(username)
关于selenium视口中元素的验证和selenium中验证点的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c# – 是否可以在不安装Selenium Server的情况下使用ISelenium / DefaultSelenium?、py+selenium拼图式拖动滑块的验证、Python+Selenium+Unittest 框架使用 ——Selenium—— 定位元素(二)、python+selenium+unnitest 写一个完整的登陆的验证的相关信息,请在本站寻找。
本文标签: