关于selenium:Selenium帮助你轻松实现浏览器多窗口操作

<article class=“article fmt article-content”><p></p><h3>多窗口解决</h3><h3>简介</h3><p>元素有属性,浏览器的窗口其实也有属性的,浏览器窗口的属性用句柄(handle)来辨认。</p><p>每个窗口都有一个惟一的窗口句柄,该句柄在窗口创立时由操作系统调配,窗口句柄通常在窗口的生命周期内放弃不变,但在某些状况下,例如窗口敞开后,句柄可能被销毁,并且操作系统能够在当前将雷同的句柄调配给其余窗口。</p><p>当浏览器关上一个窗口时,如果要在新的窗口操作就须要句柄切换。</p><h3>获取以后窗口的窗口句柄</h3><p>如果你关上了一个新的标签页或窗口,Selenium 容许应用窗口句柄来解决它,每个窗口都有一个惟一的标识符,能够应用<code>current_window_handle</code>办法取得以后窗口的窗口句柄:</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_current_window_handle(): driver = webdriver.Chrome() driver.get(“https://vip.ceshiren.com/#/ui_study/frame") # 存储窗口的 ID original_window = driver.current_window_handle print(original_window) # 查看没有关上其余的窗口 assert len(driver.window_handles) == 1</code></pre><p><strong>Java 实现</strong></p><pre><code class=“java”>WebDriverdriver=newChromeDriver();driver.get(“https://ceshiren.com”);//获取以后浏览器权柄Stringoriginal_window=driver.getWindowHandle();System.out.println(original_window);Thread.sleep(2000);// 查看没有关上其余的窗口assertdriver.getWindowHandles().size()==1;driver.close();//敞开浏览器过程driver.quit();</code></pre><p><strong>打印出的 window_handle:</strong></p><pre><code class=“python”>7762778B33FADD8682327EACA2F80119</code></pre><h3>获取所有窗口的窗口句柄</h3><p>当有多个窗口时,能够用 <code>window_handles</code> 获取所有窗口的窗口句柄。</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_window_handles(): driver = webdriver.Chrome() driver.get(“https://vip.ceshiren.com/#/ui_study/frame") # 关上一个新的窗口 driver.find_element(By.XPATH,’//[text()=“关上新窗口”]’).click() # 获取所有窗口句柄 original_window = driver.window_handles print(original_window) # 检查一下,只关上了两个窗口 assert len(original_window) == 2</code></pre><p><strong>Java 实现</strong></p><pre><code class=“python”>WebDriverdriver=newChromeDriver();driver.get(“https://ceshiren.com”);//获取以后浏览器权柄Stringoriginal_window=driver.getWindowHandle();System.out.println(original_window);//关上一个新的窗口driver.get(“https://vip.ceshiren.com/#/ui_study/frame")Thread.sleep(2000);// 查看是否关上了两个窗口assertdriver.getWindowHandles().size()==2;driver.close();//敞开浏览器过程driver.quit();</code></pre><p><strong>打印出的 window_handles:</strong></p><pre><code class=“python”>[‘019339C5C2952823653FFED6A90996B0’,‘5ED0721936240AD5FBDEA01B9F79EA61’]</code></pre><h3>切换窗口或标签页</h3><p>在进行 Web 自动化测试过程中,会遇到关上新窗口或新标签页的状况,但 WebDriver 不晓得操作系统认为哪个窗口是流动的。要应用新窗口,须要先切换到新窗口。通过打印 window_handles 能够看出,它是一个列表。</p><p>如果只有两个选项卡或窗口被关上,并且你晓得从哪个窗口开始,则你能够遍历 WebDriver,通过排除法能够看到两个窗口或选项卡,而后通过 <code>switch_to.window() </code>切换到你须要的窗口或选项卡。</p><p></p><p>从下面源代码中的阐明能够看出,<code>switch_to.window()</code> 须要提供一个 <code>window_name</code>,能够是 name 也能够是 <code>window_handle</code>。</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_handle(): # 启动驱动程序 driver = webdriver.Chrome() # 关上网址 driver.get(“https://vip.ceshiren.com/#/ui_study/frame") # 设置期待 wait = WebDriverWait(driver, 10) # 存储原始窗口的 ID original_window = driver.current_window_handle print(original_window) # 查看没有关上其余的窗口 assert len(driver.window_handles) == 1 # 单击在新窗口中关上的链接 driver.find_element(By.XPATH, “//[text()=‘关上新窗口’]”).click() # 循环遍历所有窗口句柄 for window_handle in driver.window_handles: # 查看以后窗口句柄是否等于 original_window,如果不等于,阐明找到了新的窗口 if window_handle != original_window: # 切换到新的窗口 driver.switch_to.window(window_handle) # 这里能够执行新窗口中的操作 print(driver.current_window_handle) # 此时有两个关上的窗口 assert len(driver.window_handles) == 2</code></pre><p><strong>Java 实现</strong></p><pre><code class=“java”>WebDriverdriver=newChromeDriver();driver.get(“https://vip.ceshiren.com/#/ui_study/frame");// 存储原始窗口的IDStringoriginalWindow=driver.getWindowHandle();System.out.println(“Original window handle: “+originalWindow);// 查看没有关上其余的窗口assertdriver.getWindowHandles().size()==1:“Expected only one window”;// 单击在新窗口中关上的链接driver.findElement(By.xpath(”//*[text()=‘关上新窗口’]”)).click();// 循环遍历所有窗口句柄Set<String>windowHandles=driver.getWindowHandles();for(StringwindowHandle:windowHandles){// 查看以后窗口句柄是否等于 original_window,如果不等于,阐明找到了新的窗口if(!windowHandle.equals(originalWindow)){// 切换到新的窗口driver.switchTo().window(windowHandle);// 这里能够执行新窗口中的操作}}System.out.println(driver.getWindowHandle());// 此时有两个关上的窗口assertdriver.getWindowHandles().size()==2:“Expected two windows”;driver.quit();</code></pre><p>当然也能够通过<code>driver.switch_to.window(driver.window_handles[-1])</code>来实现句柄的切换。</p><h3>创立新窗口或新标签并切换</h3><p>创立一个新窗口或新标签页,屏幕焦点将汇集在新窗口或标签页上,不须要切换到窗口或标签页。如果除了新窗口之外,还关上了两个以上的窗口或标签页,就能够通过遍历 WebDriver 看到两个窗口或选项卡,并切换到非原始窗口。</p><p><strong>Python 实现</strong></p><pre><code class=“python”>def test_new_handle(): driver = webdriver.Chrome() driver.get(“https://vip.ceshiren.com/#/ui_study/frame") sleep(2) # 关上新标签页并切换到新标签页 driver.switch_to.new_window(’tab’) sleep(2) # 关上一个新窗口并切换到新窗口 driver.switch_to.new_window(‘window’) sleep(2)</code></pre><p><strong>Java 实现</strong></p><pre><code class=“java”>WebDriverdriver=newChromeDriver();driver.get(“https://vip.ceshiren.com/#/ui_study/frame");// 关上新标签页并切换到新标签页driver.switchTo().newWindow(WindowType.valueOf(“tab”));try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){e.printStackTrace();}// 关上一个新窗口并切换到新窗口driver.switchTo().newWindow(WindowType.valueOf(“window”));try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){e.printStackTrace();}driver.quit();</code></pre><h3>总结</h3><p>每关上了一个新的标签页或窗口,Selenium 容许应用窗口句柄来解决它,每个窗口都有一个惟一的标识符,通过不同的句柄能够操纵不同的页面窗口。</p><p>获取更多软件测试技术材料/面试题解析,请点击!</p><p></p></article> ...

March 4, 2024 · 1 min · jiezi

关于selenium:Web自动化三种等待方式一篇文章教会你

三种期待形式简介在理论工作中期待机制能够保障代码的稳定性,保障代码不会受网速、电脑性能等条件的束缚。 期待就是当运行代码时,如果页面的渲染速度跟不上代码的运行速度,就须要人为的去限度代码执行的速度。 在做 Web 自动化时,个别要期待页面元素加载实现后,能力执行操作,否则会报找不到元素等各种谬误,这样就要求在有些场景下加上期待。 最常见的有三种期待形式:隐式期待、显式期待、强制期待,上面介绍以下这三种期待形式。 隐式期待隐式期待的机制是:设置一个等待时间,轮询查找(默认 0.5 秒)元素是否呈现,如果没呈现就抛出异样。这也是最常见的期待办法。 隐式期待的作用是全局的,是作用于整个 session 的生命周期,也就是说只有设置一次隐式期待,前面就不须要设置。如果再次设置隐式期待,那么后一次的会笼罩前一次的成果。 当在 DOM 构造中查找元素,且元素处于不能立刻交互的状态时,将会触发隐式期待。 Python 实现 self.driver.implicitly_wait(30)Java 实现 driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);显式期待显示期待的机制是:显式期待是在代码中定义期待条件,触发该条件后再执行后续代码,就可能依据判断条件进行期待。程序每隔一段时间进行条件判断,如果条件成立,则执行下一步,否则持续期待,直到超过设置的最长工夫。示例代码如下: Python 实现 导入显式期待from selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions...# 设置10秒的最大等待时间,期待 (By.TAG_NAME, "title") 这个元素点击WebDriverWait(driver, 10).until( expected_conditions.element_to_be_clickable((By.TAG_NAME, "title")))...Java 实现 importorg.openqa.selenium.*;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.support.ui.ExpectedConditions;importorg.openqa.selenium.support.ui.WebDriverWait;importjava.time.Duration;publicclass demo3{publicstaticvoidmain(String[]args){WebDriverdriver=newChromeDriver();driver.get("https://ceshiren.com");//显示期待,直到元素(id为kw)呈现,才进行期待WebElementelement=(newWebDriverWait(driver,Duration.ofSeconds(5))).until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));driver.close();//敞开浏览器过程driver.quit();}}这里通过导入 expected_conditions 这个库来满足显式期待所需的应用场景,然而 expected_conditions 库并不能满足所有场景,这个时候就须要定制化开发来满足特定场景。 实战演示假如:要判断某个元素超过指定的个数,就能够执行上面的操作。 Python 实现 def ceshiren(): # 定义一个办法 def wait_ele_for(driver): # 将找到的元素个数赋值给 eles eles = driver.find_elements(By.XPATH, '//*[@id="site-logo"]') # 放回后果 return len(eles) > 0 driver = webdriver.Chrome() driver.get('https://ceshiren.com') # 显式期待10秒,直到 wait_ele_for 返回 true WebDriverWait(driver, 10).until(wait_ele_for)Java 实现 ...

February 19, 2024 · 1 min · jiezi

关于selenium:Selenium3PytestAllure落地Python-Web自动化测试

download:Selenium3+Pytest+Allure落地Python Web自动化测试产品思维:让你的产品更加用户导向 在当今竞争强烈的市场中,要想打造一款胜利的产品并不容易。而要想真正做好产品,就须要有一种被称为“产品思维”的理念。那么什么是产品思维呢?它又有哪些特点和劣势呢? 简略来说,产品思维就是一种以用户需要为导向来开发和设计产品的思维形式。与传统的技术或工程思维不同,产品思维将用户体验放在首位,并且提倡通过数据分析和用户反馈来继续改良产品。这样能够让企业更加聚焦用户需要,进步产品的满意度和市场份额。 那么产品思维又有哪些特点呢?首先,它强调用户体验。在传统的产品开发过程中,往往由技术人员主导,而对用户体验的关注则绝对较少。而产品思维则将用户体验作为外围,一直优化产品的界面、性能和操作流程等方面,从而实现更好的用户体验。 其次,产品思维具备敏锐的市场洞察力。基于对用户需要的深刻理解,产品思维可能更好地把握市场变化趋势,及时调整产品的策略和方向。这样能够让企业始终保持在市场的前沿,抢占竞争劣势。 最初,产品思维强调数据驱动。通过对用户行为、应用习惯等数据进行剖析,产品思维可能及时理解用户需要和反馈,并以此作为产品改良的根据。这样能够让企业更加聚焦于用户需要,一直进步产品的满意度和市场份额。 总之,产品思维是一种十分重要的理念,它可能让企业更加聚焦于用户需要,强化市场洞察力,并通过数据分析继续改良产品。因而,如果您心愿打造一款胜利的产品,那么就请务必遵循产品思维,将用户体验放在首位,一直迭代优化,为用户提供更好的产品体验。

May 3, 2023 · 1 min · jiezi

关于selenium:selenium源码通读-commonexceptionspy异常类

1 异样类基类common/exceptions.py目录定义了各种异样类;其中WebDriverException为基类;源码如下:class WebDriverException(Exception): """ Base webdriver exception. """ def __init__(self, msg=None, screen=None, stacktrace=None): self.msg = msg self.screen = screen self.stacktrace = stacktrace def __str__(self): exception_msg = "Message: %s\n" % self.msg if self.screen is not None: exception_msg += "Screenshot: available via screen\n" if self.stacktrace is not None: stacktrace = "\n".join(self.stacktrace) exception_msg += "Stacktrace:\n%s" % stacktrace return exception_msg2 基类剖析从后边的异样类能够看出,都是继承了以上的基类;而这个基类中有三个参数: def __init__(self, msg=None, screen=None, stacktrace=None): self.msg = msg self.screen = screen self.stacktrace = stacktrace# msg:产生异样的信息# screen:产生异样进行截屏# stacktrace:异样堆栈信息此外还定义了“魔法”办法__str__,用来返回一个对象的形容信息 def __str__(self): exception_msg = "Message: %s\n" % self.msg if self.screen is not None: exception_msg += "Screenshot: available via screen\n" if self.stacktrace is not None: stacktrace = "\n".join(self.stacktrace) exception_msg += "Stacktrace:\n%s" % stacktrace return exception_msg从__str__中能够看出返回的是异样信息exception_msg,而其初始值为msg,当screen 和stacktrace 都不为空的时候,exception_msg为其它两个参数的拼接。3 常见异样类NoSuchElementException剖析咱们在做自动化的时候,常常会遇到的异样是,元素没有找到,那么它的异样类就是NoSuchElementException;NoSuchElementException源码如下:class NoSuchElementException(WebDriverException): """ Thrown when element could not be found. If you encounter this exception, you may want to check the following: * Check your selector used in your find_by... * Element may not yet be on the screen at the time of the find operation, (webpage is still loading) see selenium.webdriver.support.wait.WebDriverWait() for how to write a wait wrapper to wait for an element to appear. """ pass该异样类的阐明如下:1、找不到元素时引发2、如果遇到此类异样,可能须要查看以下内容:A、查看find_by中应用的选择器;B、元素在查找操作时可能尚未呈现在屏幕上,(网页仍在加载)请参阅selenium。网络驱动程序。反对期待WebDriverWait()理解如何编写期待包装器以期待元素呈现返回后果:pass,这里只是进行占位,阐明具体的性能应该在当前的子类中进行。4 所有异样类阐明和合成留神:以下为源码中的针对阐明,英文不好,翻译的可能有问题,但大体意思根本没有问题。异样类形容返回ErrorInResponseException在服务器端产生谬误时引发,与firefox扩大通信时可能会产生这种状况或者近程驱动服务器response 信息InvalidSwitchToTargetException当要切换的frame或窗口指标不存在时引发pass占位NoSuchFrameException当要切换的frame指标不存在时抛出,继承InvalidSwitchToTargetExceptionpass占位NoSuchWindowException当要切换的窗口指标不存在时抛出,要查找以后的流动窗口句柄集,能够获取一个列表按以下形式创建活动窗口句柄:print driver.window_handlespass占位NoSuchElementException找不到元素时引发,如果遇到此类异样,可能须要查看以下内容:A、查看find_by中应用的选择器;B、元素在查找操作时可能尚未呈现在屏幕上,(网页仍在加载)请参阅selenium。网络驱动程序。反对期待WebDriverWait()理解如何编写期待包装器以期待元素呈现pass占位NoSuchAttributeException找不到元素的属性时引发,您可能须要查看所应用的特定浏览器中是否存在该属性对…进行测试。对于同一个浏览器,某些浏览器可能有不同的属性名所有物(IE8的innerText与Firefox.textContent)pass占位StaleElementReferenceException当对元素的援用当初“stale”时引发,Stale示意元素不再呈现在页面的DOM上 InvalidElementStateException因为元素处于有效状态而无奈实现命令时引发,这可能是因为试图革除既不可编辑又不可重置的元素pass占位UnexpectedAlertPresentException出现意外alert时引发,通常在预期模式阻止webdriver窗体执行任何更多命令alert_textNoAlertPresentException切换到无提醒alert时引发,这可能是因为在收回alert时调用Alert()类上的操作造成的还没有呈现在屏幕上pass占位ElementNotVisibleException当DOM上存在元素时抛出,然而它不可见,因而无奈与之交互,在尝试单击或浏览文本时最常见暗藏在视图之外的元素的pass占位ElementNotInteractableException当DOM中存在一个元素但没有交互时抛出应用该元素将点击另一个元素进行绘制pass占位ElementNotSelectableException尝试抉择不可抉择的元素时引发,For example, selecting a 'script' element.例如,抉择“脚本”元素pass占位InvalidCookieDomainException尝试在其余域下增加cookie时引发而不是以后的URLpass占位UnableToSetCookieException当驱动程序未能设置cookie时引发pass占位RemoteDriverServerException源码没说pass占位TimeoutException当命令没有在足够的工夫内实现时引发pass占位MoveTargetOutOfBoundsException当指标提供给'ActionsChains' move()时抛出办法有效,即超出文档范畴pass占位UnexpectedTagNameException当反对类未获取预期的web元素时引发pass占位InvalidSelectorException用于查找元素的选择器未返回时引发一个网络元素。目前,只有当选择器是xpath时才会产生这种状况表达式,它要么在语法上有效 。继承NoSuchElementExceptionpass占位ImeNotAvailableException当IME反对不可用时引发。对于每个与IME相干的如果计算机上没有IME反对,则调用办法pass占位ImeActivationFailedException激活IME引擎失败时引发pass占位InvalidArgumentException传递给命令的参数有效或格局不正确pass占位JavascriptException执行用户提供的JavaScript时出错pass占位NoSuchCookieException在以后浏览上下文的流动文档的关联cookie中未找到与给定路径名匹配的cookiepass占位ScreenshotException屏幕截图变得不可能了pass占位ElementClickInterceptedException无奈实现元素单击命令,因为接管事件的元素遮挡了申请单击的元素pass占位InsecureCertificateException导航导致用户代理收回证书正告,这通常是TLS证书过期或有效的后果pass占位InvalidCoordinatesException为交互操作提供的坐标有效pass占位InvalidSessionIdException如果给定会话id不在流动会话列表中,则产生,这意味着该会话不存在或不流动pass占位SessionNotCreatedException无奈创立新会话pass占位UnknownMethodException申请的命令与已知URL匹配,但与该URL的办法不匹配pass占位

January 18, 2023 · 1 min · jiezi

关于selenium:Selenium使用丨WebDriverAPI常用操作

1 应用前提1.导入包:from selenium import webdriver2.初始化一个浏览器对象:driver = webdriver.Chrome()2 浏览器相干办法和阐明办法阐明get(url)拜访指标urlback()后退前一个页面forward()后退后一个页面refresh()刷新页面maximize_window()最大化窗口minimize_window()最小化窗口fullscree_window()全屏窗口get_window_size()获取窗口大小set_window_size(x,y)设置窗口大小close()敞开以后浏览器窗口quit()退出浏览器过程switch_to_active_element返回惟一焦点所在元素switch_to_alert()切换到alertswitch_to_default_content()切换到主窗口switch_to_frame(索引or名称or元素)切换到frame或iframeswitch_to_window(名称or句柄)切换到指定窗口current_url获取页面url地址title获取页面题目name获取以后实例的浏览器名称page_source获取以后页面的源码current_windows_handle获取以后页面的句柄Window_handles获取所有回话的窗口句柄3 获取页面元素的相干信息办法阐明.tag_name获取标签名.size获取元素大小.text获取元素的文本get_attribute(’id/name/value等‘)获取元素的属性信息.is_displayed()判断元素是否可见.is_enabled()判断元素是否可用.is_selected()判断元素是否是选中状态4 鼠标操作1.导入类,from selenium.webdriver.common.action_chains import ActionChains2.定位要操作的元素3.固定写法,ActionChains(driver).xxx操作(pars).perform()办法阐明click()鼠标单击ActionChains(driver).click(ele).perform()鼠标单击ActionChains(driver).double_click(ele).perform()鼠标双击ActionChains(driver).context_click(ele).perform()鼠标右击ActionChains(driver).move_to_element(ele).perform()鼠标指针悬浮操作ActionChains(driver).drag_and_drop(source,target).perform()鼠标拖动操作ActionChains(driver).key_down(ele).perform()按下鼠标左键5 键盘操作办法阐明send_keys('value')输出文字clear()清空内容如果应用组合键,须要导入包from selenium.webdriver.common.keys import Keys组合办法如下:办法阐明send_keys('keys.CONTROL','a')Ctrl+Asend_keys('keys.CONTROL','c')Ctrl+Csend_keys('keys.CONTROL','v')Ctrl+Vsend_keys(Keys.ENTER)回车ActionChains(driver).key_down(Keys.CONTROL).perform() ele.click()按下ctrl. 单击元素6 期待机制6.1 隐性期待webdriver会在预约好的工夫内继续地检测元素是否找到,一旦找到,就执行后续的动作,超过了预约工夫未找到,就报错(全局期待),应用.implicitly_wait(time)会减缓测试速度-删除须要整个页面加载实现才执行-图片,js隐形会烦扰显性,最好不要和显性期待一起应用6.2 显性期待webdriver期待页面加载实现,找到某个条件产生后再继续执行后续代码,如果超过设置工夫检测不到则抛出异样(某个特定元素设置的期待)导入类:from selenium.webdriver.support.ui import WebDriverWait.until().until_not()导入模块:from selenium.webdriver.support import expected_conditionstitle_is(title)title_contains(title)element_to_be_selected(element)语法:WebDriverWait(driver,timeout).until(可执行的办法,超时后返回的信息)实例:WebDriverWait(self.driver,10).until(expected_conditions.title_is('管理系统'))失常应用场景:初始化:wait=WebDriverWait(self.driver,10) 应用:self.wait.until(expected_conditions.title_is('管理系统'))6.3 强制期待固定期待多长时间time.sleep(time)7 截图.get_screenshot_as_file('D:\selenium.png')

January 18, 2023 · 1 min · jiezi

关于selenium:Selenium使用丨元素定位综述

1 F12工具应用以下以Chrome浏览器为例: 1.1 关上关上浏览器后,间接按“F12” # 1.2 调整显示地位如图:Dock side,有四种显示地位,别离为新窗口关上、居左、底部、居右显示 1.3 页面元素查看点击左上角的鼠标箭头后,鼠标挪动到页面的元素后,可查看具体的元素,如图中的“1”点击图中“2”图标,能够清空以后的元素 如查看“百度一下”这个元素的属性,如下: 1.4 复制元素属性辨认到元素后,在对应的“Elements”中,鼠标右键,进行复制元素属性 其中copy内容依据不同的元素显示会有区别,大体有以下几种意思:Copy element:复制元素Copy outerHtml:复制指定标签及标签内的所有元素Copy selector:复制选择器Copy JS path:复制js门路Copy styles:复制款式Copy XPath:复制xpathCopy full XPath:复制残缺门路xpath,从html标签开始2 selenium罕用定位和办法2.1 xpath定位2.1.1 关系定位(门路)定位子元素//div/a定位子元素或后辈元素//div//a父元素//div/..最初一个子元素//div/div[last()]第n个子元素//div//tr[n]2.1.2 元素属性//div[@id='value']2.1.3 层级+属性//div/button/span[@id='value']2.1.4 运算逻辑//div/[@id='value' and @class='value']2.1.5 文本定位//div[text()='value']2.1.6 罕用办法属性蕴含某字段//div[contain(@属性,'value')]属性以某字段结尾//div[start-with(@属性,'value')]属性以某字段结尾//div[ends-with(@属性,'value')]text中蕴含某字段//div[contain(text(),'value')]2.2 css selector定位# css:选择器和申明# .class# #id# *# element# element>element# element1 element2# element1 element2:last-child# [attribute='value']# 属性蕴含某字段 //div[属性*=‘value’)]# 属性以某字段结尾 //div[属性^=‘‘value’)]# 属性以某字段结尾 //div[属性$=‘‘value’)]2.3 两个办法find_element(BY.xx,'值')办法find_elements(BY.xx,'值')办法1、导入类:from selenium.webdriver.common.by import By2、间接传递:id,name,XPath,CSS,如driver.find_element('id','xxx')3、借助By来传递,如driver.find_element('By.ID,'xxx')

January 18, 2023 · 1 min · jiezi

关于selenium:Selenium-WebDriver-API-学习笔记三浏览器控制

读了虫师《Selenium 2自动化测试实战 基于Python语言》一书,感触颇深,内容十分丰盛。现整顿下来,供后续学习参考应用。本次次要整顿的是元素浏览器管制之二。内容在“Selenium WebDriver API 学习笔记(二):浏览器管制”根底上增加。 9.设置元素期待 ①显式期待:WebDriverWait(driver,poll_fequency=0.5,ignored_exceptions=None)②隐式期待:driver.implicitly_wait(time) time可自定义③sleep休眠:sleep(time) time可自定义10.定位一组元素 在之前定位单个元素的element后加sfind_elements_by_id(); find_elements_by_name(); find_elements_by_class_name(); find_elements_by_tag_name(); find_elements_by_link_text(); find_elements_by_partial_link_text(); find_elements_by_xpath(); find_elements_by_css_selector(); 11.多表单切换 driver.swtich_to.frame()12.多窗口切换 driver.switch_to.widow() 用于切换到相应的窗口current_window_handle 获取以后窗口句柄window_handles 返回所有窗口的句柄到以后会话13.正告框解决 text:返回 alert/confirm/prompt中的文字信息accept(): 承受现有正告框dismiss(): 遣散现有正告框send_keys(keysToSend): 发送文本至正告框14.上传文件一般上传:将本地文件的门路作为一个值放在input标签中,通过form表单将这个值提交给服务器插件上传:指基于Flash,JavaScript或Ajax等技术实现上传性能 ①send_keys()如:from selenium import webdriverimport osdriver = webdriver.Chrome()file_path='file:///' + os.path.abspath('upfile.html')driver.get(file_path)#定位上传按钮,增加本地文件driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')driver.quit()②AutoIt实现上传 下载应用http://www.autoitscript.com/site/15.下载文件 from selenium import webdriverimport osfp=webdriver.Firefoxprofile()fp.set_preference("browser.download.folderList",2)#0是默认门路,2是指定门路fp.set_preference("browser.download.manager.showWhenStarting",False)#是否显示开始fp.set_preference("browser.download.dir",os.getcwd())#用于指定所下载的文件的目录fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下载文件的类型driver=webdriver.Firefox(firefox_profile=fp)driver.get("http://pypi.Python.org/pypi/selenium")driver.find_element_by_partial_link_text("selenium-2").click()16.操作Cookie WebDriver操作cookie的办法:get_cookies(): 获取所有的cookie信息get_cookie(name): 返回字典的key为“name”的cookie信息add_cookie(cookie_dict):增加cookie。cookie_dict为字典对象,必须有name,value值delete_cookie(name,optionsString):删除cookie信息delete_all_cookies():删除所有的cookie信息17.调用JavaScipt 调整浏览器滚动条地位window.scrollTo(右边距,上边距)18.解决HTML5的视频播放 load(),play(), pause() 加载,播放,暂停19.窗口截图 driver.get_screenshot_as_file("D:\\xxxxx")#截取以后窗口,并指定截图图片的保留地位20.敞开窗口 quit():退出相干程序和敞开所有窗口;close():敞开以后窗口21.验证码的解决 ①去掉验证码②设置万能验证码③验证码辨认技术④记录cookie

January 10, 2023 · 1 min · jiezi

关于selenium:Selenium-WebDriver-API-学习笔记二浏览器控制

读了虫师《Selenium 2自动化测试实战 基于Python语言》一书,感触颇深,内容十分丰盛。现整顿下来,供后续学习参考应用。本次次要整顿的是浏览器管制操作之一。1.管制浏览器窗口大小 set_window_size(); 如set_window_size(640,480); 即宽640,高480maximize_window(); 窗口最大化,不须要参数,间接应用2.管制浏览器进退、后退 back(); 返回forwar(); 后退如 driver.back(); 其中driver=webdriver.Chrome()3.模仿浏览器刷新 refresh(); 如driver.refresh()相似F54.简略元素操作 ①clear(); 革除文本②send_keys(*value); 模仿按键输出③click(); 单击元素举例:driver.find_element_by_id("qwe").clear()driver.find_element_by_id("qwe").send_keys("tyyu")driver.find_element_by_id("login").click()5.webelement接口罕用办法 size:返回元素的尺寸text:获取元素的文本get_attributte(name):取得属性is_displayed():设置改元素是否用户可见举例:size=driver.find_element_by_id("qwe").size 获取输入框的尺寸text=driver.find_element_by_id("qwe").text 获取文本信息attributte = driver.find_element_by_id("qwe").get_ attributte('type') 能够是id、name、type或其余任意属性result= driver.find_element_by_id("qwe"). is_displayed() 返回元素的后果是否可见,返回后果为Ture或者False6.鼠标事件 perform(): 执行所有ActionChains中存储的行为context_click(): 右击double_click(): 双击drag_and_drop(element, targetmove_to_element(): 鼠标悬停举例:①rom selenium.webdriver.common.action_chains import ActionChains 先引入ActionChains类driver = webdriver.Chrome()driver.get("http://www.baidu.com")#...#定位到要右击的元素right_click = driver.find_element_by_id("qwe")#对定位到的元素执行鼠标右击操作ActionChains(driver).context_click(right_click).perform()阐明:ActionChains(driver):调用这个类,将浏览器驱动driver作为参数传入context_click(right_click):模仿邮件操作,在应用时须要指定元素定位perfom():将指定所有ActionChains中存储的行为。②above=driver.find_element_by_id("qwer")ActionChains(driver).move_to_element(above).perfom()其余办法相似7.键盘事件 Keys类提供了键盘上所有的按键办法from selenium.webdriver.common.keys import Keyssend_keys(Keys.BACK_SPACE) 删除键send_keys(Keys. SPACE) 空格键send_keys(Keys.TAB) 制表键send_keys(Keys.ESCAPE) 回退键send_keys(Keys.ENTER) 回车键send_keys(Keys.CONTROL,'a') 全选send_keys(Keys.CONTROL,'c') 复制send_keys(Keys.CONTROL,'x') 剪贴send_keys(Keys.CONTROL,'v') 粘贴send_keys(Keys.F1)...send_keys(Keys.F12) F1-F128.取得验证信息 title, URL, text举例:now_url=driver.current_url 获取以后页面URLtitle=driver.title 获取以后页面titletext前边曾经提及到,不赘述

January 9, 2023 · 1 min · jiezi

关于selenium:Selenium-WebDriver-API-学习笔记一元素定位

读了虫师《Selenium 2自动化测试实战 基于Python语言》一书,感触颇深,内容十分丰盛。现整顿下来,供后续学习参考应用。本次次要整顿的是元素定位的形式。 1. id定位 find_element_by_id(); 2. name定位 find_element_by_name(); 3. class属性定位 find_element_by_class_name(); 4. tag属性定位 find_element_by_tag_name(); 5. 元素标签之前的文本信息来定位 find_element_by_link_text(); 6. 取文本链接的一部分来定位 find_element_by_partial_link_text(); 7. xpath多种定位策略 find_element_by_xpath(); ①绝对路径: find_element_by_xpath("html/body/div[2]/div[2]/div[3]/div[2]/form/input[1]"); ②元素属性: find_element_by_xpath("//input[@id='qwe']"); find_element_by_xpath("//input[@name='qwe']"); find_element_by_xpath("//input[@class='qwe']");find_element_by_xpath("//*[@id='qwe']"); ③层级属性: find_element_by_xpath("//span[@class='qwe']/input");find_element_by_xpath("//form[@id='qwe']/span[2]/input");④运算逻辑: find_element_by_xpath("//input[@id='qwe' and @class='qwer']/span/input");8. css选择器定位 find_element_by_css_selector(); 其中css也有多种策略:①class属性: find_element_by_css_selector(".qwe");②id属性: find_element_by_css_selector("#qwe"); ③标签名: find_element_by_css_selector("input"); A.父子关系: find_element_by_css_selector("span>input");B.属性定位: find_element_by_css_selector('[type="submit"]');C.组合定位: find_element_by_css_selector("form.fm>span>input>input.qwe");9.BY元素定位 以上提到的8种定位办法,webdriver还提供了另一套写法,即对立调用find_element()办法,通过BY来申明定位的办法,并且传入对应定位办法的定位参数。应用BY之前须要插入BY类:from selenium.webdriver.common.by import Byfind_element(BY.ID,"qwe");find_element(BY.NAME,"qwe");find_element(BY.CLASS_NAME,"qwe");find_element(BY.TAG_NAME,"qwe");find_element(BY.LINK_TEXT,"xxxxx");find_element(BY.PARTIAL_LINK_TEXT,"dddd");find_element(BY.XPATH,"//* [@id='qwe']");find_element(BY.CSS_CELECTOR," span>input ");

January 9, 2023 · 1 min · jiezi

关于selenium:Selenium3PytestAllure落地Python-Web自动化测试内置文档

download:Selenium3+Pytest+Allure落地Python Web自动化测试内置文档在java中应用中断来告诉线程进行失常进行螺纹公共类RightWayStopThreadWithoutSleep实现Runnable { @笼罩公共有效运行(){int num = 0;而(!Thread.currentThread()。isInterrupted() && numif (num % 10000 == 0) {System.out.println(num+"是1W的倍数");}num++;}System.out.println("工作实现了!");} 公共动态void main(String[] args)引发InterruptedException {Thread Thread = new Thread(new RightWayStopThreadWithoutSleep());thread . start();//期待1sthread . sleep(1000);//告诉进行线程thread.interrupt()。}}复制代码应用thread.interrupt()告诉线程进行。然而线程须要合作:应用thread.currentthread()。isinterrupted () in while来检测线程的以后状态。运行后果:…………21730000是1W的倍数。21740000是1W的倍数。21750000是1W的倍数。21760000是1W的倍数。21770000是1W的倍数。21780000是1W的倍数。21790000是1W的倍数。21800000是1W的倍数。工作实现了! 过程完结,退出代码为0复制代码进行线程,以防它被阻塞。公共类RightWayStopThreadWithSleep {公共动态void main(String[] args)引发InterruptedException {runnable runnable =()--> {int num = 0;while(数字if (num % 100 == 0) {System.out.println(num+"是100的倍数");}num++;}尝试{//期待1秒模仿阻塞。thread . sleep(1000);} catch (InterruptedException e) {System.out.println("线程曾经进行!!");e . printstacktrace();}}; Thread thread =新线程(runnable);thread . start();//等待时间应小于下面设置的1秒,否则线程会在执行到下一个thread.interrupt()之前完结;明码thread . sleep(500);//告诉进行线程thread.interrupt()。}}复制代码在线程休眠1秒的过程中,中断信号被中断,在线程睡眠期间响应中断的形式是抛出InterruptedException。运行后果:是0到100的倍数。00是100的倍数。200是100的倍数。30是100的倍数。线程进行!!中断异样:睡眠中断at java.lang.Thread.sleep(原生办法)在进行线程处。rightwaystopthreadwithsleep . lambda$main$0(rightwaystopthreadwithsleep . Java:19)位于Java . lang . thread . run(thread . Java:748) ...

September 22, 2022 · 2 min · jiezi

关于selenium:Selenium3PytestAllure落地Python-Web自动化测试内置文档

download:Selenium3+Pytest+Allure落地Python Web自动化测试小微企业跨组织人才管理系统介绍因为后期比拟懒,把竞赛题的剖析交给了文的同学,导致剖析不到位,有点跑题。侥幸的是,这不是一个大问题。后期打算用ssm做框架。两头阶段在一本书上发现了一个用jsp写的模板,就间接复制了。前期为了减少ajax、拦截器、文件上传下载性能,退出了SpringMVC架构。因而,这四个不同点就产生了,用的是SpringMVC架构,而JDBC...,总而言之,我还是没教训,见机行事! 我的项目代码上面将展现局部代码,源代码能够在这里下载,1.拦截机它旨在通过间接输出地址来避免拜访和分级权限治理。后果没用,还是写了。...公共类LoginInterceptor实现HandlerInterceptor { public boolean pre handle(http servlet request申请、HttpServletResponse响应、对象处理程序)引发ServletException、IOException {//如果是登录页面,就公布。system . out . println(" uri:"+request . getrequest uri());if (request.getRequestURI()。蕴含(“登录”){返回true} if (request.getRequestURI()。蕴含(“验证”){返回true} http session session = request . getsession(); //如果用户曾经登录,则开释它。if(((String)session . get attribute(" validated "))。等于(" ok")) {返回true} 返回false}}复制代码2.文件上传和下载原本认为程序会依据以后员工的编号,主动更改上传文件的文件名,而后保留。这种状况下,浏览或下载文件也能够间接依据员工号作为文件名进行搜寻。然而,为了不便起见,这里没有体现。它只是一个失常的文件上传和下载性能。文件上传@ request mapping("/郭城")公共字符串fileUpload2(@RequestParam("郭城")CommonsMultipartFile文件,HttpServletRequest申请)抛出IOException { //上传保留设置的门路门路=申请;getservletcontext();get real path("/work product ");File realPath =新文件(门路);如果(!realPath.exists()){real path . mkdir();}//上传文件地址System.out.println("上传文件的保留地址:"+realPath); //间接用CommonsMultipartFile的办法写文件(这次留神)file.transferTo(新文件(real path+"/"+File . getoriginalfilename())); Return "window.alert('上传胜利!')" +" history . back()";}复制代码下载文件@ request mapping(value = "/download CG ")公共字符串downloads1(HttpServletResponse响应,HttpServletRequest申请)引发异样{//要下载的图片的地址门路=申请;getservletcontext();get real path("/work product ");String fileName = " 1234567.pdf ...

September 22, 2022 · 2 min · jiezi

关于selenium:UI-自动化的页面对象管理工具之实现思路

原文由alex发表于TesterHome社区网站,点击原文链接可与作者间接交换本文将介绍下 UI 自动化的页面对象管理工具PO-Manager之实现思路: 更多PO-Manager的介绍,可查看上篇《UI 自动化的页面对象治理神器 PO-Manager》 根本架构 如图所示,该工具作为vscode 插件,因为要跟webpage的dom 进行双向沟通,咱们将借用webdriver 里的js 执行器来进行通信。 加载插件咱们须要启动一个chromedriver session, 同时加载一个chrome插件, 这插件其是基于selenium IDE recorder的一个革新版本, //driver = new Builder().forBrowser('chrome').build(); const builder = new Builder().withCapabilities({ browserName: 'chrome', 'goog:chromeOptions': { // Don't set it to headless as extensions dont work in general // when used in headless mode args: [`load-extension=${path.join(__dirname + '../../build')}`], }, }) driver = await builder.build()而后在每个dom 里会有上面几个办法: //在dom中咱们将通过给window 对象绑定新函数的形式注入咱们须要调用的办法window.__side.selectElement = async callback => { await window.__side.postMessage(window, { action: 'select', }).then(callback)}window.__side.generateElement = async (callback, options) => { await window.__side.postMessage(window, { action: 'generateElement', builderOptions: options }).then(callback)}window.__side.generateElements = async (callback, options) => { await window.__side.postMessage(window, { action: 'generateElements', builderOptions: options }).then(callback)}window.__side.generateAllElements = async (callback, options) => { await window.__side.postMessage(window, { action: 'generateAllElements', builderOptions: options }).then(callback)}vscode 调用在PO-Manager 中咱们将通过jsExecutor 去向对应的web页面中执行js脚本,你可能会好奇这里为啥要用executeAsyncScript 而不是executeScript, 并且还有个callback,这个其实是因为咱们抉择页面元素是一个异步过程,所以须要callback 来保障正确的返回。executeAsyncScript的用法能够参考这里: ...

March 16, 2022 · 3 min · jiezi

关于selenium:UI-自动化的页面对象管理神器-POManager

原文由alex发表于TesterHome社区网站,点击原文链接可与作者间接交换。做 UI 自动化的同学都晓得,UI 自动化一个难点就是页面元素的变动,让自动化保护成为一个痛点。在此,为了加重这个痛点,我在基于 Page-Object 模式的根底上开发了页面对象保护的工具。 该工具为 vscode 的一个插件, 能够通过 vscode 插件市场搜寻 PO-Manager 来下载安装 本文中的页面对象库文件基于 json.一个元素对象的定义蕴含元素名,定位形式 (id,name,css, xpath 等等) 和定位, 如百度首页新闻链接: "新闻 Link": {"type": "linkText","locator": "新闻"} 然而一个页面有 n 多的元素,咱们如果一个个手动增加的话,也是要花费不少工夫。那咱们来主动增加一下: 增加元素对象 批量增加元素对象 当然,对于新页面,你也能够间接抉择增加所有元素,简略间接抓取所有页面元素。 在元素对象增加后,咱们能够在右边的 LOCATORS view 里看到以后文件里的对象,点击对应的元素节点,能够尝试高亮元素来验证元素定位是否正确。-高亮/查找元素 如果元素定位失败,右下角音讯提醒 NoSuchElement, 则咱们能够通过 update element 来更新元素定位器。大大降低了保护老本。 更新元素对象定位 selenium 命令调试:在元素节点上右键点击,能够看到一些 selenium 的命令,能够帮助调试该元素的属性,能够防止咱们一遍遍的运行测试脚本而到最初确发现点击/操作错了元素。 GitHub 仓库地址: https://github.com/zzhengjian/PO-Manager 原文由alex发表于TesterHome社区网站,点击原文链接可与作者间接交换。想理解更多关开源工具,与更多开源我的项目作者间接交换?欢送关注第十届中国互联网测试开发大会(MTSC 2002 上海)· 开源专场 >>>

March 15, 2022 · 1 min · jiezi

关于selenium:selenium-定位总结

原文由周小丽发表于TesterHome社区,点击原文链接能够和作者间接交换xpath 有两种示意办法,绝对路径和相对路径,绝对路径是指从根开始,以/开始,如/html/body/div,相对路径是指在一个门路下,另外的门路以这个门路作为参照,以//开始。测试时,个别应用相对路径查找元素 (装置 ChroPath 插件,能够查找 xpath 门路)。xpath 用法来源于:https://www.cnblogs.com/purel... 怎么进步 selenium 脚本的自动化执行效率?1、优化测试用例,尽可不应用 sleep,缩小应用 ImplicitlyWait,而应用 selenium 的 wait/FluentWait,这样能够优化等待时间2、应用 selenium grid,通过 testng 实现并发执行3、 针对一些不稳固的动静控件通过 JS 实现操作4、重载 testng 的 listener 实现 retry 机制,进步测试用例成功率 xpath 根本用法: 1、属性定位 示意办法://标签名 [@ 属性名=属性值] ,通过繁多的属性即可查找到元素。如:查找输出文本框,//input[@id='kw'] 2、and 组合属性定位 示意办法://标签名 [@ 属性名 1=属性值 and 属性名 2=属性值],当繁多属性无奈定位惟一元素时,能够组合多个属性进行查找。如:查找输出文本框,//input[@name='wd' and @class=s_ipt] 3、通过父元素找子元素 示意办法: //父元素/子元素,当查找的元素没有特色属性时,其父元素有特色属性时,能够通过其父元素往下查找。如:查找输出文本框,//span[@id='s_kw_wrap']/input 4、通过先人元素找子孙元素 示意办法://先人元素//子孙元素,当查找的元素没有特色属性时,其先人元素有特色属性时,能够通过其先人元素往下查找。如:查找输出文本框,//span[@id='s_kw_wrap']//input 5、通过子元素找父元素 示意办法://子元素/..,当查找的元素没有特色属性,其子元素有特色属性时,能够通过其子元素往上查找。如:查找输出文本框的父元素,//input[@id='kw']/.. 6、通过文本定位,示意办法://标签名 [text()=文本内容](text 前不须要加 @ 符号),常常和 contains() 组合应用。如,定位【新闻】对应的 a 标签,//a[text()='新闻'] ...

March 8, 2022 · 1 min · jiezi

关于selenium:selenium-使用代理

动态代理# 毋庸明码验证办法chromeOptions = webdriver.ChromeOptions()chromeOptions.add_argument('--proxy-server=http://ip:port') driver = webdriver.Chrome(chrome_options=chromeOptions)应用隧道代理#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import print_function from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsimport stringimport zipfile def create_proxyauth_extension(proxy_host, proxy_port, proxy_username, proxy_password, scheme='http', plugin_path=None): """Proxy Auth Extension args: proxy_host (str): domain or ip address, ie proxy.domain.com proxy_port (int): port proxy_username (str): auth username proxy_password (str): auth password kwargs: scheme (str): proxy scheme, default http plugin_path (str): absolute path of the extension return str -> plugin_path """ if plugin_path is None: plugin_path = '/tmp/vimm_chrome_proxyauth_plugin.zip' manifest_json = """ { "version": "1.0.0", "manifest_version": 2, "name": "Chrome Proxy", "permissions": [ "proxy", "tabs", "unlimitedStorage", "storage", "<all_urls>", "webRequest", "webRequestBlocking" ], "background": { "scripts": ["background.js"] }, "minimum_chrome_version":"22.0.0" } """ background_js = string.Template( """ var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "${scheme}", host: "${host}", port: parseInt(${port}) }, bypassList: ["foobar.com"] } }; chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); function callbackFn(details) { return { authCredentials: { username: "${username}", password: "${password}" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, {urls: ["<all_urls>"]}, ['blocking'] ); """ ).substitute( host=proxy_host, port=proxy_port, username=proxy_username, password=proxy_password, scheme=scheme, ) with zipfile.ZipFile(plugin_path, 'w') as zp: zp.writestr("manifest.json", manifest_json) zp.writestr("background.js", background_js) return plugin_path# 生成隧道代理 插件proxyauth_plugin_path = create_proxyauth_extension( proxy_host="transfer.mogumiao.com", proxy_port=9001, proxy_username="username", # 输出隧道账号 proxy_password="passwod", # 输出明码 plugin_path="D:\chrome_proxyauth_plugin.zip" ) # 在options中调用options = Options()options.add_argument("--start-maximized")options.add_extension(proxyauth_plugin_path) # driver = webdriver.Chrome(chrome_options=options)driver.get("https://www.baidu.com/")

February 7, 2022 · 1 min · jiezi

关于selenium:selenium增加失败截屏

1、selenium外面自带截屏工具: 2、对于每次失败都要进行截屏操作,能够写一个装璜器3、调用装璜器,此处调用的函数要写在类内,办法外定义,要不装璜器无奈援用 4、执行办法过程中如果有异样,则会进行截屏操作。

January 28, 2022 · 1 min · jiezi

关于selenium:自动化selenium内容扩充

1、首先理解webdriver,selenium外围玩的就是他; 2、其次晓得根本的元素定位 b.find_element_by_id() 等函数 3、说白了就是要把握元素定位的办法,先手工在浏览器开发者模式下可能失常定位到元素 通过XPATH: xpath中定位元素,个别倡议相对路径: //的模式 *代表所有 //*[@id=''] 如果两头须要另外一个配合则加一个and xpath也有内置的办法text() Xpath定位元素的几种形式 1)绝对路径定位 a = browser.find_element_by_xpath('/html/body/div/div[2]/div/div/div/from/span/input')绝对路径定位存在很大的问题就是如果页面元素一扭转元素的xpath也会随之扭转,很不稳固,不举荐应用 2)标签+属性定位——xpath = "//标签名[@属性='属性值']" 例如,百度首页的输入框的xpath就能够示意为//[@id="kw"],其中示意所有的标签名 当繁多的属性无奈确定到一个元素时,能够应用组合属性的形式例如,百度首页的输入框能够示意为//*[@id="kw" and @name="wd"] 当然,也能够应用其余的逻辑运算,比方or、not 3)text()办法定位 百度首页的新闻超链接的xpath能够示意为//*[text()='新闻'] 4)contains()办法定位,也叫含糊定位 xpath = "//标签名[contains(@属性, '属性值')]"例如,百度首页的新闻也能够写成//a[contains(@name,'news')] 5)starts-with,ends-with办法定位 starts-with --匹配以xx结尾的属性值;ends-with -- 匹配以xx结尾的属性值//*[starts-with(@value,'百度一')]能够定位到百度一下按钮;然而browser.find_element_by_xpath("//a[ends-with(@name,'_trnews')]")定位不到新闻,那是因为ends-with是Xpath2.0的用法,然而浏览器个别通常只反对Xpath1.0 6)如果一个元素无奈通过本身的属性定位到,那么能够先定位到他的上一级或者上N级,而后再一级一级地找到他 例如,定位到百度首页的输入框,能够示意成//form[@id='form']/span[contains(@class,'s_ipt_wr')]/input 4、在自动化中的外围就是判断页面的响应,也就是当一个元素或者控件进去后才进行下一步,及这个页面是否因为点击或者其余操作而呈现 WebDriverWait(dr, 10).until(lambda the_driver: the_driver.find_element_by_id('dropdown1').is_displayed()) 这个就是期待元素呈现,并判断是否展现; coding:utf-8from selenium import webdriver#导入By类from selenium.webdriver.common.by import By#导入显示期待类from selenium.webdriver.support.ui import WebDriverWait#导入冀望场景类from selenium.webdriver.support import expected_conditionsdriver = webdriver.Chrome()alert_is_present():判断页面是否呈现alert框result=WebDriverWait(driver,10).until(expected_conditions.alert_is_present())print(result.text)5、selenium外面的坑,就是浏览器界面的坑,无非就是iframe的嵌套中,要来回切换跳转,切换到iframe中去搞,之后再切出来 switch_to_frame() switch_to_window() 开释iframe,从新回到主页面上 driver.switch_to.default_content() 6、selenium中有些组件仍不能满足条件,或者对于某些元素的点击及定位都无奈获取,则能够去用应用selenium间接操作JS来封装办法去调用。 driver.execute_script(c) c外面能够写js的代码

January 27, 2022 · 1 min · jiezi

关于selenium:自动化selenium思路只是思路一篇就够了

1、首先理解webdriver,selenium外围玩的就是他; 2、其次晓得根本的元素定位 b.find_element_by_id()等函数 3、说白了就是要把握元素定位的办法,先手工在浏览器开发者模式下可能失常定位到元素 通过XPATH: xpath中定位元素,个别倡议相对路径: //的模式 *代表所有 //*[@id=''] 如果两头须要另外一个配合则加一个and xpath也有内置的办法text() 4、在自动化中的外围就是判断页面的响应,也就是当一个元素或者控件进去后才进行下一步,及这个页面是否因为点击或者其余操作而呈现 WebDriverWait(dr, 10).until(lambda the_driver: the_driver.find_element_by_id('dropdown1').is_displayed()) 这个就是期待元素呈现,并判断是否展现; 5、selenium外面的坑,就是浏览器界面的坑,无非就是iframe的嵌套中,要来回切换跳转,切换到iframe中去搞,之后再切出来 switch_to_frame() switch_to_window() 6、selenium中有些组件仍不能满足条件,或者对于某些元素的点击及定位都无奈获取,则能够去用应用selenium间接操作JS来封装办法去调用。

January 27, 2022 · 1 min · jiezi

关于selenium:Selenium3-与-Python3-实战-Web自动化测试框架网盘分享

download:Selenium3 与 Python3 实战 Web自动化测试框架一 为什么使用内部文件当JavaScript脚本代码很简单或多个HTML页面需要使用到JavaScript脚本时,可能将JavaScript脚本的代码编写到一个内部文件中,总体来说使用内部文件有以下长处。易保护将JavaScript编写在多个页面中,在查找谬误或在修改代码时会非常麻烦。如果将JavaScript编写在内部文件中,在保护时会提高保护效率和俭约保护的工夫。重用性使用JavaScript内部文件可能避免重复编写代码。在多个页面中使用雷同的JavaScript时可能将其编写到内部文件中,俭约开发工夫。俭约加载页面工夫把一段JavaScript代码编写到多个页面中,岂但减少了开发工夫,还减少了页面大小和页面加载的工夫。如果把JavaScript编写到内部文件中,当多个页面使用同一个内部文件时,只需要加载一次,俭约了页面加载工夫,放慢了页面浏览速度。二 使用src属性调用内部文件在创建JavaScript脚本的内部文件时不需要使用标记,然而文件的扩展名必须使用.js类型。调用内部文件可能使用标记的src属性。如果JavaScript脚本内部文件保存在本机中,src属性可能是相对路径或是绝对路径。如果JavaScript脚本内部文件保存在其余服务器中,src属性需要指定相对的路径。 div<input type = "button" value="红色" nclick="changcolor(this)"><input type = "button" value="彩色" nclick="changcolor(this)"> css文件为mycss.css: .style{width:600px;height:300px;background-color:red;} people{width:300px;}.card{width:123px;height:444px;}

November 30, 2021 · 1 min · jiezi

关于selenium:爬虫pythonseleniumfirefox使用与部署详解

我的幻想,值得我自己去争取,我明天的生存,绝不是我昨天生存的淡漠剽窃。—— 司汤达《红与黑》一. 概述自己并不是业余爬虫工程师,只是对爬虫感兴趣学习过 requests、scrapy 等 python 库用来爬取一些网站数据,最近刚好因为须要,又开始做一些爬虫相干的工作,写本文的目标是将本人学习过程和遇到的问题记录下来,一方面坚固学习的常识,另一方面心愿对遇到同样问题的敌人提供一些帮忙。 本文次要从以下几个方面介绍(这也是本人学习的过程): 为什么要应用 selenium传统形式配置应用 selenium二. 为什么要应用 selenium在应用爬虫工具比方 requests 时候,应用 requests.get(url)命令获取网页内容,发现没有咱们须要的内容,那是因为有些网页是前后端拆散,须要浏览器执行 js 脚本通过 ajax 申请获取数据再渲染到页面,间接申请这个页面地址的话,失去的html下面是没有数据的。有些网站的网页是通过 js 生成的,并非原生的 HTML 代码,这其中并不蕴含 Ajax 申请。 如何解决这个问题呢?通常状况下能够剖析 js 脚本,找到调用的接口,间接申请接口获取数据,然而这些接口有加密或者验证,申请接口是比拟麻烦的。对于须要执行 js 脚本能力生成页面的网站是无奈间接通过接口获取数据的,为了不便,咱们能够间接应用 selenium + (浏览器驱动)firefox 模仿浏览器的行为,通过这个工具就能够执行 js 脚本获取到整个网页的残缺数据。 selenium 是一个自动化测试工具 具体内容及应用能够查看官网文档:https://www.selenium.dev/docu... 比方今日头条新闻网页的数据数据通过算法加密,无奈间接申请接口,须要破解它的加密规定,网上有很多大佬写过如果抓取今日头条的数据,能够自行百度查找,总之有很多坑很麻烦,前面会介绍如何应用 selenium 抓取今日头条的数据。 大略晓得了应用 selenium 能够获取任何网页中的数据,然而应用 selenium 存在的毛病如下: 效率较低 每一次申请相当于要关上一次浏览器,这个启动效率绝对于间接调用接口来说是非常低的,通常须要几秒的工夫。 资源节约 selenium 模仿浏览器的行为,大量申请会极其耗费资源 三. 传统形式配置应用 selenium1. 在 windows 中配置 selenium这里次要演示应用 python + selenium 来爬取数据,所以上面只会介绍 python 的装置形式,其余装置形式能够查看官网文档。 装置 Selenum 库应用上面的命令装置 selenium 库: ...

August 15, 2021 · 2 min · jiezi

关于selenium:Web-UI自动化的设计和实践

背景UI 自动化测试,即通过自动化的伎俩来管制机器模仿人进行手工操作。随着 GrowingIO 业务的一直倒退,新需要的一直减少,回归测试的工作越来越重,现有测试的资源曾经不足以应答沉重的回归测试工作,亟需 UI 自动化来代替人手工进行回归测试,解放回归测试的人力去做更精准的测试。因而,引出下文在 GrowingIO 的Web UI 自动化的建设,本文次要就以下两个方面开展介绍: 1.框架搭建 2.集成品质平台 框架搭建PageObject家喻户晓,UI 自动化测试,是位于测试金字塔塔尖的地位,ROI 低。其痛点次要体现在: 1.测试用例保护老本高,页面元素定位形式或者布局有一些轻微的变动,之前写好的代码可能就有很大的改变; 2.代码冗余,复用性低,可读性不好。 针对以上痛点,同时也通过大量调研,决定应用 PageObject 设计模式,其核心思想为六大准则: 公共办法代表页面提供的服务不要裸露页面细节不要把断言和操作细节混用办法能够 Return 到新的页面不要把整页内容都放到 PageObject 中雷同的行为产生不同的后果,能够封装不同后果根据以上六大准则,并联合 GrowingIO 具体业务的状况,目录层级设计如下: BasePage 层:封装对网页的一些根底操作的办法,比方关上浏览器、查找元素、截屏等Component 层:继承 BasePage 层,封装了对页面中公共组件的操作方法,比方工夫组件Page 层:继承Component层,该层中的每个办法都对应以后页面的一个性能,办法里能够调用Component 层中的办法或调用 BasePage 层中封装的办法TestCase 层:调用业务 Page 层中封装的办法,编写业务 Case,并做断言理论我的项目的目录分层如下: ├── basepage│   └── base_page.py├── component│   └── element_design.py├── conf│   ├── conf.py├── datas├── log│   └── all.log├── log.py├── page│   ├── home_page.py│   ├── login_page.py│   ├── main_page.py│├── pytest.ini├── report│  ├── requirements.txt├── run_all_cases.py├── testcase│   ├── conftest.py│   ├── testcase.py│└── util └── util.pySelenium + Python语言选择 Python,对于新人敌对且组内人员比拟相熟,能够迅速上手; ...

July 16, 2021 · 2 min · jiezi

关于selenium:浩若烟海事半功倍利用Docker容器技术构建自动化分布式web测试集群Selenium-Grid

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_195 “世界上有那么多城市,城市里有那么多的酒馆,可她,却偏偏走进了我的.....”,这是电影《卡萨布拉卡》中的一句驰名独白,投射到现实生活中,与之类似的状况举不胜举,这世界上有那么多的零碎,零碎中有那么多的浏览器,在只有一台测试机的前提下,难道咱们只能排队一个一个地做兼容性测试吗?有没有效率更高的办法呢?为此咱们提出一个更高效的解决方案:应用Docker+Selenium Grid。 Selenium Grid是一个分布式WebUI测试工具,能够将测试流程散发到多台服务器上,并行地执行。Selenium Grid架构中蕴含两个次要角色:Hub是中心点管制节点,而Node是Selenium的工作节点,它们注册到Hub上,并会操作浏览器执行由Hub下发的主动测试用例。 也就是利用一个调度核心,别离在不同机器上装置不同的操作系统,零碎中再装置对应须要测试的浏览器,然而,以传统的形式部署分布式Selenium Grid集群有肯定的技术难度。而且一个浏览器在操作系统上只能装置一个版本且只能有一个运行实例。比方为了针对不同版本的Chrome进行测试,须要将指定版本的Chrome浏览器装置到不同物理机或虚拟机上,这样要消耗大量工夫和机器老本来筹备测试环境。 怎么简化Selenium Grid集群装置过程中的复杂性呢?答案是Docker,是的,Docker,又见Docker,Docker能够在单台服务器上利用容器技术间接部署多个节点,过程简略不便,只须要编写Dockerfile脚本即可,大大晋升了测试效率,本次咱们就应用Docker+Selenium Grid来实现多零碎多版本浏览器并发式兼容性测试。 首先,装置Docker,请移步:win10零碎下把玩折腾DockerToolBox以及更换国内镜像源(各种神坑) 随后,拉取Selenium Grid调度核心的镜像文件: docker pull selenium/hub这里咱们测试两款不同的浏览器兼容性:Chrome、FireFox 所以别离拉取镜像文件: docker pull selenium/node-chrome docker pull selenium/node-firefox全副三个镜像下载胜利后,输出命令: docker images查看本地镜像: liuyue:mytornado liuyue$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE selenium/node-chrome latest 0843e55de3dc 2 weeks ago 1.04GB selenium/hub latest 705be32777f0 2 weeks ago 283MB selenium/node-firefox latest f794497d8393 2 months ago 956MB查看没有问题后,咱们来编写Docker-compose的配置文件,Docker-compose是最根本的容器编排工具,它能够疾速兼顾多个镜像的协同应用,编写docker-compose.yml: version: "3" services: hub: image: selenium/hub ports: - "4444:4444" environment: GRID_MAX_SESSION: 16 GRID_BROWSER_TIMEOUT: 3000 GRID_TIMEOUT: 3000 chrome: image: selenium/node-chrome container_name: chrome depends_on: - hub environment: HUB_PORT_4444_TCP_ADDR: hub HUB_PORT_4444_TCP_PORT: 4444 NODE_MAX_SESSION: 4 NODE_MAX_INSTANCES: 4 volumes: - /dev/shm:/dev/shm ports: - "9001:5900" links: - hub firefox: image: selenium/node-firefox container_name: firefox depends_on: - hub environment: HUB_PORT_4444_TCP_ADDR: hub HUB_PORT_4444_TCP_PORT: 4444 NODE_MAX_SESSION: 2 NODE_MAX_INSTANCES: 2 volumes: - /dev/shm:/dev/shm ports: - "9002:5900" links: - hub配置文件的次要内容就是将Selenium Grid的容器服务hub部署在4444端口上,并且通过端口映射,让宿主机能够拜访,应用镜像就是咱们刚刚下载好的selenium/hub镜像,而火狐(firefox)和谷歌(chrome)这两款浏览器别离依赖于hub服务,NODE\_MAX\_INSTANCES定义了能够运行多少个浏览器实例。 ...

June 27, 2021 · 3 min · jiezi

关于selenium:selenium爬虫一行代码去掉所有webdriver痕迹

问题首先回顾前两篇selenium系列selenium爬虫应用了代理为什么还是被服务器断定为机器人?以及selenium爬虫应用代理状况下不设置这几个参数,代理就白加了,正确的敞开webrtc以及设置成代理的时区和地理位置,能够很好的帮咱们的浏览器伪装成正儿八经的失常浏览器,犹如滤镜能够把王大妈变身成风靡万千宅男的乔碧萝。然而,这还不够,风控系统有各种形式能够将你揪出来。所以应粉丝的要求,明天动笔了: 怎么如德芙般丝滑地去掉selenium烦人的webdriver痕迹? 起因起因很简略,咱们应用selenium+chromedriver启动chrome的时候,会在chrome的navigator以及document对象里注入一些属性,如果web服务器返回的js代码里有对这些属性的检测,那咱们就会被辨认为机器人在拜访。 解决方案解决方案逻辑上很简略,就是selenium额定加了什么咱们去除掉什么。咱们先上没有去掉webdriver的selenium代码 from selenium import webdriver chrome_options = webdriver.ChromeOptions()chrome_options.add_experimental_option( "excludeSwitches", ["enable-automation"])chrome_options.add_experimental_option('useAutomationExtension', False)chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')chrome_options.add_argument( 'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')driver = webdriver.Chrome( "./chromedriver", chrome_options=chrome_options)driver.get("https://bot.sannysoft.com/") 测试后果截图: 咱们能够看到,webdriver被检测进去了,也就是说服务器晓得你应用了selenium拜访其网站。 咱们上去掉webdriver的代码的selenium代码 from selenium import webdriver chrome_options = webdriver.ChromeOptions()chrome_options.add_experimental_option( "excludeSwitches", ["enable-automation"])chrome_options.add_experimental_option('useAutomationExtension', False)chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')chrome_options.add_argument( 'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')chrome_options.add_argument("disable-blink-features=AutomationControlled")#就是这一行通知chrome去掉了webdriver痕迹driver = webdriver.Chrome( "./chromedriver", chrome_options=chrome_options)driver.get("https://bot.sannysoft.com/") 测试后果截图: 咱们能够看到通过在chrome启动的时候加一个disable-blink-features=AutomationControlled的flag就能够实现降维打击,移除掉webdriver的痕迹,妈妈再也不必放心你加班了…… 如果你们认为做到以上:敞开webrtc、设置浏览器时区和地理位置、去掉webdriver就居安思危了吗? No,这还不够,服务器还能揪出你,你只能给老板发送以下短信。 而后持续加班。 想晓得更多的反检测形式,咱们下期见!图片源于:页游

May 18, 2021 · 1 min · jiezi

关于devops:Selenium-WebDriver教程

【注】本文译自:https://www.edureka.co/blog/s... 在本教程中,我将向您介绍 Selenium Webdriver,它是当今市场上应用最宽泛的自动化测试框架。它是开源的,可与所有驰名的编程语言(如Java、Python、C#、Ruby、Perl等)一起应用,以实现浏览器流动的自动化。通过本文,我将告诉您开始应用 Selenium WebDriver 测试 Web 应用程序所需理解的所有信息。 以下是本教程的主题: 什么是 Selenium Webdriver?Selenium 容易学吗?Selenium 软件有什么作用?Selenium 的基本知识是什么?Selenium RC 的毛病和 WebDriver 的诞生什么是浏览器元素?定位网页上的浏览器元素浏览器元素上的操作什么是 Selenium WebDriver? Selenium WebDriver 是一个基于 Web 的自动化测试框架,能够测试在各种Web浏览器和各种操作系统上启动的网页。实际上,您还能够自在应用各种编程语言(例如Java、Perl、Python、Ruby、C#、PHP 和 JavaScript)编写测试脚本。请留神,Mozilla Firefox 是 Selenium WebDriver 的默认浏览器。 然而很多时候,刚入门的测试人员会想到这个疑难: Selenium 好学吗? 要用在行的话答复这个问题,我会说:”是的,是!”。Selenium 真的很容易学习和把握,因为您只须要对任意一种常见的编程语言(例如 Java、C#、Python、Perl、Ruby、PHP)有根本的理解。事后把握这些编程语言中的任何一种的都可有助于编写测试用例。然而,如果您没有,那就不要放心了。Selenium IDE 是一个能够无效应用的基于 GUI 的工具。 Selenium 软件有什么作用? 以下是 Selenium 软件最吸引人的一些用处: 自动化测试:在大型项目中,自动化测试会派上用场,在大型项目中,如果不是 Selenium,测试人员将必须手动测试每个创立的性能。应用 Selenium,所有手动工作都能够自动化,从而加重了测试人员的累赘和压力。跨浏览器兼容性:Selenium 反对多种浏览器,例如:Chrome、Mozilla Firefox、Internet Explorer、Safari 和 Opera。进步测试覆盖率:通过自动化的测试,能够缩小总体测试工夫,从而为测试人员腾出工夫来同时在不同的测试场景下执行更多测试。缩小测试执行工夫:因为 Selenium 反对并行测试执行,因而能够大大减少并行测试执行工夫。多操作系统反对:Selenium WebDriver 提供跨 Windows、Linux、UNIX、Mac 等多种操作系统的反对。应用 Selenium WebDriver,您能够在 Windows 操作系统上创立测试用例并在 Mac 操作系统上执行。Selenium 的基本知识是什么? WebDriver 是 Selenium v2.0 的一部分。Selenium v1 仅由 IDE,RC 和 Grid 组成。然而 Selenium 我的项目的次要冲破是开发 WebDriver 并将其作为 Selenium v2 的代替产品引入。然而,随着 Selenium v3 的公布,不举荐应用 RC,而将其迁徙到旧版软件包中。 您依然能够下载并应用 RC,但不要冀望对其提供任何反对。 ...

April 24, 2021 · 2 min · jiezi

关于selenium:DevOps进行时基于Selenium的自动化测试脚本执行原理分析-IDCF

摘要Selenium是一系列基于web的界面自动化测试工具汇合,提供了全面的测试函数,用于反对B/S类利用的界面自动化测试。 Selenium能够间接管制浏览器实现各种操作,反对多个平台、多种浏览器、多种编程语言的测试脚本。 本文次要论述了selenium 1和Webdriver执行自动化测试脚本的原理,并通过一个简略的自动化测试脚本实例进行原理分析。 关键字:自动化测试、selenium 1、webdriver 一、selenium整体框架Selenium的外围selenium core基于JsUnit,齐全由JavaScript编写,因而可运行于任何反对JavaScript的浏览器上,反对的浏览器包含IE、Firefox、chrome等。 Selenium测试间接运行在浏览器中,就像真正的用户在操作一样。这个工具的次要性能包含:测试与浏览器的兼容性(测试应用程序是否可能在不同浏览器和操作系统上运行)、测试零碎性能(测试性能和用户需要)。 selenium反对主动录制和生成测试脚本,可生成JAVA、python、C#等不同语言的测试脚本。selenium蕴含selenium IDE、selenium webdriver、selenium remote control(RC)和selenium Grid等组件,如图1所示。 图1 selenium框架 Selenium IDE是一个集成测试工具,被嵌套在firefox浏览器中,作为firefox浏览器的一个插件来应用。测试人员能够通过selenium IDE来录制网页界面上的操作,能够对录制的动作进行编辑、调试以及疾速回放。将用户在浏览器中执行的操作记录下来,生成各种模式的脚本,并可将这些脚本保留供当前应用和保护。 Selenium 1 (selenium-RC)是selenium最次要的测试工具之一,它所具备的某些性能即便是新版的selenium 2也无奈反对。它可能通过多种语言(JAVA、JavaScript、Ruby、PHP、Python、Perl和C#)编写测试代码,同时可能反对简直所有浏览器的测试。 Selenium 2,通常称为webdriver,次要性能集成了selenium 1以及webdriver(webdriver已经是selenium的竞争对手)。也就是说,Selenium 2是selenium和webdriver两个我的项目的合并,即Selenium 2兼容Selenium,它既反对selenium API(应用程序编程接口)也反对Webdriver API。比照selenium 1时代的selenium RC,webdriver劣势显著。 Selenium RC通过selenium server把javascript脚本注射到浏览器中,而后通过特定的测试脚本调用javascript命令,实现与浏览器的交互操作。webdriver通过原生浏览器反对或者浏览器扩大间接管制浏览器,比Selenium 1更简略易学,并且速度大幅提高,调用的稳定性取决于浏览器自身,更加迷信。相应产生的问题就是,不同的浏览器厂商,对web元素的操作和出现多少会有一些差别,这就间接导致了selenium webdriver要辨别浏览器厂商,提供不同的实现。 Selenium Grid使得selenium 能同时并行地、在不同的环境上运行多个测试工作,极大地放慢了web利用的功能测试。 二、Selenium 1工作原理Selenium 1是selenium中最次要的第一代测试工具,相比于selenium 2,它更加成熟、稳固,能反对简直所有浏览器的测试。 Selenium 1的毛病是: 编码方式是面向过程而非面向对象,易用性较差;通过Selenium Core间接驱动浏览器,运行速度不如webdriver。上面简略介绍一下selenium 1的工作原理。Selenium 1蕴含的次要组件有: Selenium服务器:负责启动或敞开浏览器;解释和运行从测试程序中传来的selenese命令(selenese是seleniumIDE中应用的命令集),并能够表演HTTP代理的角色;捕捉和验证在浏览器和被测试的应用程序之间传递的HTTP音讯。客户端库文件提供了各种编程语言和selenium RC服务器之间的接口。 图2 selenium1架构 2.1 Selenium服务器Selenium服务器用于接管测试程序传来的selenium命令,解释并执行他们,而后向测试程序反馈测试的后果。Selenium服务器捆绑了Selenium-core并主动将其注入浏览器,该步骤在测试程序关上浏览器(调用客户端文件的API函数)时执行。Selenium-core是JavaScript程序,也就是说,它是一系列JavaScript函数,用于调用浏览器内置的JavaScript解释器,以解释和执行selenese命令 该服务器同样能够接管来自测试程序的HTTP GET/POST申请的selenese命令,这意味着能够应用任何反对HTTP申请的编程语言来编写测试代码。 2.2 Selenium客户端库文件客户端库文件提供了对编程的反对,这样就能够本人设计程序来运行selenium命令。对于每一种反对的编程语言,都有不同的客户端库文件。Selenium客户端库文件提供了编程接口,用于在程序中运行selenium命令。 客户端库文件能够生成selenese命令,而后将其传递到selenium服务器,对被测试的应用程序执行指定的动作或者测试。客户端文件也能够接管命令执行的后果,并将其传递给应用程序,应用程序能够依据返回后果判断以后测试是通过还是失败。 因而要创立测试程序,只须要通过客户端库文件API编写程序,用它来执行一系列Selenium命令。也能够在Selenium IDE中创立Selenese测试脚本,导出成客户端驱动的API函数调用,如图3所示。 图3 导出selenium1执行脚本 三、webdriver工作原理这部分具体形容一下webdriver工作原理。援用一个形象的类比,能够把webdriver驱动浏览器类比成出租车司机开出租车,这个场景中有三个次要角色: ...

February 24, 2021 · 1 min · jiezi

关于selenium:selenium脚本编写注意点二

一、定位iframe1、什么是iframeiframe,又叫浮动帧标记,是内嵌的网页元素,能够将一个html文件嵌入到另一个html文件中显示2、iframe操作的办法switch_to_iframe() 切换到iframe上switch_to.frame() 切换到iframe上switch_to.default_content() 切换回原主页面 当咱们调用switch_to_iframe时,编译器会在办法上划一条线。阐明,这个办法尽管能用,然而曾经过期,不举荐用。查阅文档能够发现,有一种办法将其替换switch_to.frame() 。所以咱们间接应用switch_to.frame()就能够了。 二、多标签页切换1、单纯切换标签页,切换的标签页无奈操作2、正确的多标签页切换应用办法 selenium提供了一个叫做switch_to_window来进行切换,不过在应用switch_to_window代码上会呈现个横线,而后提醒错误信息。这个是因为switch_to_window是老办法了,应用新办法switch_to.window()就能够了 在应用switch_to.window()之前须要获取切换的标签的句柄,应用driver.window_handles就能够获取标签页面的句柄在应用driver.switch_to.window切换到豆瓣页面 接口测试能够应用国产的接口测试和接口文档生成工具:apipost

January 18, 2021 · 1 min · jiezi

关于selenium:软件测试selenium脚本编写注意点一

在通过python+selenium编写ui自动化脚本的时候,我遇到过很多须要留神的点,明天分享给大家一下。 一、睡眠工夫1、 强制等待时间 sleep()必须导入time包后才能够应用,强制期待失效工夫=页面跳转工夫+sleep()设置休眠工夫 强制等待时间应用语法:sleep(s) s示意工夫,以秒为单位 例:sleep(2) 休眠2s 2、显示等待时间 WebDriverWait() 必须导入WebDriverWait包才能够应用,显示等待时间是针对单个元素失效的,当在规定工夫内找到了对应元素,则执行下一步操作。 显示等待时间应用语法:WebDriverWait(x,y,z).until(lambda x:x.find_element_by_元素定位办法(“对应元素办法的值”)) x示意网页窗口对象y示意总等待时间(s)z示意期待过程中,每隔多久查看一次元素,单位s ntil是固定格局,能够了解为直到元素定位到为止,lambda x:x是一个匿名函数构建的办法,这里不太好了解能够了解为固定格局lambda总体就是网页窗口对象,而前面的.find_element_by_…就是引用之前的定位办法 3、隐式等待时间 implicitly_wait() 智能等待时间,是针对全局的元素都失效,不须要导入包。当在规定工夫内找到了对应元素,则执行下一步操作。 隐等待时间应用语法: 网页对象名.implicity_wait()from selenium import webdriverfrom time import sleep #导入强制等待时间的包from selenium.webdriver.support.ui import WebDriverWait #导入显示等待时间的包dr = webdriver.Firefox()dr.maximize_window()dr.implicitly_wait(5) #隐式工夫期待,智能期待,针对于全局dr.get(“https://www.baidu.com”)sleep(2) #休眠2sa = WebDriverWait(dr,10,2).until(lambda x:x.find_element_by_id(“kw”)) #显示等待时间,针对于单个元素进行工夫的期待a.send_keys(“123”) 总结:只针对一个元素进行工夫的期待,要是找不到该元素则会始终耗费完所有的等待时间才进行下一步二、定位alert弹出框alert弹出框蕴含三种:alert 揭示对话框confirm 确认对话框prompt 要求用户输出,而后返回后果的对话框 1、定位办法 switch_to.alert:定位到alert/confirm/prompttext:返回alert/confirm/prompt 中的文字信息。accept:点击确认按钮。dismiss:点击勾销按钮,如果有的话。send_keys:输出值,这个alertconfirm 没有对话框就不能用了,不然会报错。 2、alert用法 3、confirm用法 4、prompt用法 接口测试举荐应用国产接口测试和接口文档生成工具:apipost

January 15, 2021 · 1 min · jiezi

关于selenium:selenium安装使用

装置selenium不少人应用pip命令来装置selenium,辛辛苦苦装置完之后,还是不能应用。所以咱们能够是间接应用编译器,pycharm间接装置selenium扩大包。 file中点击settings在Settings中点击Project Interpreter,点击加号就能够装置各种须要的扩大包间接搜寻selenium,抉择selenium,点击Install Package,等selenium装置好就能够应用selenium了。 在装置谷歌驱动,查看本人电脑上的谷歌版本拜访http://chromedriver.storage.g...,下载对应的谷歌驱动.下载实现之后,把谷歌驱动放到我的项目的文件夹中关上浏览器,拜访百度这就是selenium装置应用了。 接口测试工具能够应用国产的接口测试工具:apipost

January 14, 2021 · 1 min · jiezi

关于selenium:29selenium模块是一个python操作浏览器软件的一个模块可以实现js动态网页请求

【百度云搜寻,搜各种材料:http://www.lqkweb.com】【搜网盘,搜各种材料:http://www.swpan.cn】selenium模块 selenium模块为第三方模块须要装置,selenium模块是一个操作各种浏览器对应软件的api接口模块 selenium模块是一个操作各种浏览器对应软件的api接口模块,所以还得须要下载对应浏览器的操作软件 操作原理是:selenium模块操作浏览器操作软件,浏览器操作软件操作浏览器 Selenium 2.0实用于以下浏览器 Google Chrome Internet Explorer 7, 8, 9, 10, 11 Firefox Safari Opera HtmlUnit phantomjs Android iOS Selenium 的外围,就是用js管制浏览器 下载对应浏览器的浏览器操作软件 Chrome: https://sites.google.com/a/ch...Edge: https://developer.microsoft.c...Firefox: https://github.com/mozilla/ge...Safari: https://webkit.org/blog/6900/... 咱们这里以火狐浏览器为列 首先将火狐浏览器的操作软件,geckodriver.exe文件搁置到爬虫目录里 selenium模块能够模仿用户行为操作各种版本浏览器 webdriver.Firefox('操作浏览器软件门路')实例化火狐浏览器对象get('url')拜访网站find_element_by_xpath('xpath表达式')通过xpath表达式找对应元素clear()清空输入框里的内容send_keys('内容')将内容写入输入框click()点击事件get_screenshot_as_file('截图保留门路名称')将网页截图,保留到此目录page_source获取网页htnl源码browser.close() 敞开浏览器 #!/usr/bin/env python# -*- coding:utf8 -*-from selenium import webdriver  # 导入selenium模块来操作浏览器软件import timebrowser = webdriver.Firefox(executable_path='H:/py/16/adc/adc/Firefox/geckodriver.exe')browser.get('https://www.tmall.com/?spm=a220o.1000855.a2226mz.1.5c90c3484bZCx6')# 模仿用户操作browser.find_element_by_xpath('//input[@id="mq"]').clear()                 # 通过xpath表达式找到输入框,clear()清空输入框里的内容browser.find_element_by_xpath('//input[@id="mq"]').send_keys('连衣裙')     # 通过xpath表达式找到输入框,send_keys()将内容写入输入框browser.find_element_by_xpath('//button[@type="submit"]').click()          # 通过xpath表达式找到搜寻按钮,click()点击事件time.sleep(3)   # 期待3秒browser.get_screenshot_as_file('H:/py/17/img/123.jpg')  # 将网页截图,保留到此目录neir = browser.page_source   # 获取网页内容print(neir)browser.close()     # 敞开浏览器利用scrapy的Selector办法。来过滤帅选数据 Selector()办法,过滤帅选数据,参数是失去的字符串html源码 #!/usr/bin/env python# -*- coding:utf8 -*-from selenium import webdriver  # 导入selenium模块来操作浏览器软件import timefrom scrapy.selector import Selectorbrowser = webdriver.Firefox(executable_path='H:/py/16/adc/adc/Firefox/geckodriver.exe')browser.get('https://www.tmall.com/?spm=a220o.1000855.a2226mz.1.5c90c3484bZCx6')# 模仿用户操作browser.find_element_by_xpath('//input[@id="mq"]').clear()                 # 通过xpath表达式找到输入框,clear()清空输入框里的内容browser.find_element_by_xpath('//input[@id="mq"]').send_keys('连衣裙')     # 通过xpath表达式找到输入框,send_keys()将内容写入输入框browser.find_element_by_xpath('//button[@type="submit"]').click()          # 通过xpath表达式找到搜寻按钮,click()点击事件time.sleep(3)   # 期待3秒browser.get_screenshot_as_file('H:/py/17/img/123.jpg')  # 将网页截图,保留到此目录neir = browser.page_source   # 获取网页内容# print(neir)gl_neir = Selector(text=neir)dedao = gl_neir.css('title::text').extract()print(dedao)browser.close()     # 敞开浏览器selenium操作浏览器滚动滚动条 execute_script(js)办法,执行原生态js脚本 #!/usr/bin/env python# -*- coding:utf8 -*-from selenium import webdriver  # 导入selenium模块来操作浏览器软件import timefrom scrapy.selector import Selectorbrowser = webdriver.Firefox(executable_path='H:/py/16/adc/adc/Firefox/geckodriver.exe')browser.get('https://www.oschina.net/blog')time.sleep(3)       # 期待3秒for i in range(3):  # 滚动3次滚动条    js = 'window.scrollTo(0,document.body.scrollHeight); var lenofpage=document.body.scrollHeight; return lenofpage'    browser.execute_script(js)  # 执行js语言滚动滚动条    time.sleep(3)neir = browser.page_source   # 获取网页内容# print(neir)gl_neir = Selector(text=neir)dedao = gl_neir.css('title::text').extract()print(dedao)# browser.close()     # 敞开浏览器设置申请网页不加载图片,进步申请效率ChromeOptions()办法,创立谷歌浏览器设置对象Chrome()办法,创立谷歌浏览器对象 上面以谷歌浏览器为列 #!/usr/bin/env python# -*- coding:utf8 -*-from selenium import webdriver  # 导入selenium模块来操作浏览器软件from scrapy.selector import Selector#设置申请网页不加载图片,进步申请效率chrome_options = webdriver.ChromeOptions()                          #创立谷歌浏览器设置对象prefs = {"profile.managed_default_content_settings.images": 2}      #设置谷歌浏览器不加载图片chrome_options.add_experimental_option('prefs', prefs)              #将不加载图片增加到浏览器browser = webdriver.Chrome(executable_path='H:/py/16/adc/adc/Firefox/chromedriver.exe', chrome_options=chrome_options)# browser.set_page_load_timeout(40) #设置页面最长加载工夫为40sbrowser.get('https://www.taobao.com/')neir = browser.page_source   # 获取网页内容# print(neir)gl_neir = Selector(text=neir)dedao = gl_neir.css('title::text').extract()print(dedao)# browser.close()     # 敞开浏览器selenium模块还能够操作PhantomJS浏览器,PhantomJS是一个无界面浏览器,比拟清新,然而多线程是性能会降落 重点:咱们举荐应用chromedriver.exe,谷歌浏览器

November 10, 2020 · 1 min · jiezi

关于selenium:selenium之nodejs入门使用

selenium详解见此篇:https://www.fenxianglu.cn/art... 有了对selenium文档的理解,这里还须要做一个hello world演示,不然不晓得怎么跑起来的,心里总感觉不难受,所以上面介绍下基于nodejs的selenium启动应用 首先nodejs是要装置的,这个间接到 https://nodejs.org/en/ 上下载安装即可 而后创立 test/index.js 目录文件 依据selenium写官网下载页的批示,这里须要下载JavaScript的依赖包 下载地址:https://www.npmjs.com/package... npm下载 test> npm install selenium-webdriver --save装置实现之后还须要下载浏览器驱动器,这里以firefox为例,下载操作系统对应版本,而后放到test目录下即可 相应浏览器驱动器列表 浏览器可执行文件Chromechromedriver(.exe) 64位的须要度娘找解决方案Internet ExplorerIEDriverServer.exeEdgeMicrosoftWebDriver.msiFirefoxgeckodriver(.exe)Safarisafaridriverindex.js对应内容如下: const { Builder, By, Key, until } = require("selenium-webdriver");(async function example() { let driver = await new Builder().forBrowser("firefox").build(); // 以firefox浏览器为指标构建器 try { await driver.get("https://www.baidu.com"); await driver.findElement(By.className("s_ipt")).sendKeys("selenium"); // 找到输入框,填充内容 await driver.findElement(By.className("s_btn")).sendKeys(Key.ENTER); // 触发enter键,执行搜寻 await driver.wait(until.titleIs("百度一下,你就晓得"), 1000); // 判断title是否为“百度一下,你就晓得”,不是则报错,是则继续执行 console.log(222) } finally { // await driver.quit(); // 退出浏览器 }})();执行脚本 ...

October 30, 2020 · 1 min · jiezi

关于selenium:Selenium-执行JavaScript语句

Selenium 提供了两种执行 JavaScript 脚本的办法: execute_script:同步执行——罕用execute_async_script:异步执行 利用场景1:工夫输入框有些工夫输入框控件,增加了 readonly 属性,限度该控件只读,不可写入,那就无奈间接通过 send_keys() 输出内容。 对于这种状况的解决形式及步骤: 通过 JavaScript 脚本移除 readonly 属性清空输入框内容按工夫格局输出信息 from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.12306.cn/index/") # 跳转至测试页面sleep(1)js = "document.getElementById('train_date').removeAttribute('readonly')" # 编写 JavaScript 语句移除 readonly 属性driver.execute_script(js) # 同步执行 JavaScript 语句element = driver.find_element_by_id("train_date") # 定位元素element.clear() # 清空内容sleep(1)element.send_keys("2020-08-10") # 输出内容sleep(2)driver.quit() # 敞开浏览器利用场景2:操作滚动条操作滚动条罕用的 JavaScript 语句: 序号JavaScript 语句形容1document.documentElement.scrollTop=1000挪动到间隔顶部 1000 的地位2window.scrollTo(0, document.body.scrollHeight*0.5)按高度比例挪动到相对地位(x轴方向, y轴方向)3window.scrollTo(0, 1000)挪动到相对坐标地位(x轴方向, y轴方向)4window.scrollBy(0, -200)绝对以后坐标挪动相应间隔(x轴方向, y轴方向)from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.douban.com/") # 跳转至测试页面sleep(1)js1 = "document.documentElement.scrollTop=500" # y轴方向 挪动到间隔顶部 500 的地位js2 = "window.scrollTo(0, document.body.scrollHeight*0.5)" # y轴方向 挪动到坐标为总高度的50% 的地位js3 = "window.scrollTo(0, 1000)" # y轴方向 挪动到高度为 1000 的地位js4 = "window.scrollBy(0, -500)" # 绝对以后地位向上挪动 500driver.execute_script(js1) # 执行 JavaScript 语句sleep(3)driver.execute_script(js2) # 执行 JavaScript 语句sleep(3)driver.execute_script(js3) # 执行 JavaScript 语句sleep(3)driver.execute_script(js4) # 执行 JavaScript 语句sleep(3)driver.quit() # 敞开浏览器总结 ...

August 6, 2020 · 1 min · jiezi

关于selenium:Selenium-select下拉列表处理

针对 select 标签的下拉列表,Selenium 提供了 Select 类进行操作: from selenium.webdriver.support.ui import SelectSelect 类罕用办法: 序号办法/属性形容1select_by_value()依据值抉择2select_by_index()依据索引抉择(从1开始)3select_by_visible_text()依据文本抉择4deselect_by_value()依据值反选5deselect_by_index()依据索引反选6deselect_by_visible_text()依据文本反选7deselect_all()反选所有8options获取所有选项9all_selected_options获取所有选中的选项10first_selected_option获取第一个选中的选项select 单选框对于 select 单选框,操作比较简单,创立 Select 对象后,间接应用 Select 类中的办法抉择即可。 实例利用 from selenium import webdriverfrom time import sleepfrom selenium.webdriver.support.ui import Selectdriver = webdriver.Chrome() # 关上浏览器driver.get("http://sahitest.com/demo/selectTest.htm") # 跳转至测试页面sleep(1)select_element = Select(driver.find_element_by_id("s1")) # 创立Select对象select_element.select_by_value("46") # 依据值抉择sleep(1)select_element.select_by_index(4) # 依据索引抉择(从1开始)sleep(1)select_element.select_by_visible_text("Home Phone") # 依据文本抉择sleep(1)driver.quit()select 多选框对于 select 多选框,如果须要选中某几个选项,那么,要留神革除原来曾经选中的选项。 实例利用 from selenium import webdriverfrom time import sleepfrom selenium.webdriver.support.ui import Selectdriver = webdriver.Chrome() # 关上浏览器driver.get("http://sahitest.com/demo/selectTest.htm") # 跳转至测试页面sleep(1)select_element = Select(driver.find_element_by_id("s4Id")) # 创立Select对象select_element.deselect_all()select_element.select_by_value("o1val") # 依据值抉择sleep(1)select_element.select_by_index(4) # 依据索引抉择(从1开始)sleep(1)select_element.select_by_visible_text("o2") # 依据文本抉择sleep(1)# 打印所有选项的文本for option in select_element.options: print(option.text)sleep(2)driver.quit()总结 ...

August 6, 2020 · 1 min · jiezi

关于selenium:Selenium-屏幕截图

在自动化测试程序运行时,有些中央呈现了 bug,此时,咱们心愿能够将以后运行的屏幕的截图保留下来,不便开发者后续进行调试与修复。 Selenium 提供的屏幕截屏办法: 序号办法/属性形容1save_screenshot(filename)截取以后屏幕截图,并保留为指定文件,filename 为指定的保留门路或图片文件名2get_screenshot_as_base64()获取以后屏幕截图 base64 编码字符串3get_screenshot_as_file(filename)获取以后截图,应用残缺的门路4get_screenshot_as_png()获取以后截图的二进制文件数据实例操作# 利用1:save_screenshot 间接保留在以后门路from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至测试页面sleep(1)element = driver.find_element_by_id("kw") # 定位输入框element.send_keys("自动化测试") # 输出内容sleep(1)driver.save_screenshot("baidu.png") # 截屏sleep(2)driver.quit() # 敞开浏览器# 利用1:save_screenshot 应用以后工夫作为文件名from selenium import webdriverfrom time import sleep, strftime, localtime, timedriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至测试页面sleep(1)element = driver.find_element_by_id("kw") # 定位输入框element.send_keys("自动化测试") # 输出内容sleep(1)file_name = strftime("%Y%m%d-%H%M%S", localtime(time())) + ".png"driver.save_screenshot(file_name) # 截屏sleep(2)driver.quit() # 敞开浏览器

August 6, 2020 · 1 min · jiezi

关于selenium:Selenium-屏幕截图

在自动化测试程序运行时,有些中央呈现了 bug,此时,咱们心愿能够将以后运行的屏幕的截图保留下来,不便开发者后续进行调试与修复。 Selenium 提供的屏幕截屏办法: 序号办法/属性形容1save_screenshot(filename)截取以后屏幕截图,并保留为指定文件,filename 为指定的保留门路或图片文件名2get_screenshot_as_base64()获取以后屏幕截图 base64 编码字符串3get_screenshot_as_file(filename)获取以后截图,应用残缺的门路4get_screenshot_as_png()获取以后截图的二进制文件数据实例操作# 利用1:save_screenshot 间接保留在以后门路from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至测试页面sleep(1)element = driver.find_element_by_id("kw") # 定位输入框element.send_keys("自动化测试") # 输出内容sleep(1)driver.save_screenshot("baidu.png") # 截屏sleep(2)driver.quit() # 敞开浏览器# 利用1:save_screenshot 应用以后工夫作为文件名from selenium import webdriverfrom time import sleep, strftime, localtime, timedriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至测试页面sleep(1)element = driver.find_element_by_id("kw") # 定位输入框element.send_keys("自动化测试") # 输出内容sleep(1)file_name = strftime("%Y%m%d-%H%M%S", localtime(time())) + ".png"driver.save_screenshot(file_name) # 截屏sleep(2)driver.quit() # 敞开浏览器

August 6, 2020 · 1 min · jiezi

关于selenium:Selenium-alert-弹窗处理

页面弹窗有 3 种类型: alert(正告信息)confirm(确认信息)prompt(提醒输出)对于页面呈现的 alert 弹窗,Selenium 提供如下办法: 序号办法/属性形容1accept()承受2dismiss()勾销3text获取显示的文本4send_keys()输出内容对应解决形式: alert(正告信息):WebDriver.switch_to.alert.accept()confirm(确认信息): WebDriver.switch_to.alert.accept()WebDriver.switch_to.alert.dismiss()prompt(提醒输出):WebDriver.switch_to.alert.send_keys()alert(正告信息)弹出框alert(正告信息)弹出框,目标是提醒告诉信息,只须要用户看完点击确认即可。 from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("http://sahitest.com/demo/alertTest.htm") # 跳转至测试页面sleep(1)element = driver.find_element_by_name("b1") # 定位element.click() # 点击sleep(1)alert = driver.switch_to.alert # 切换到弹窗print(alert.text) # 打印弹窗显示的信息:Alert Messagealert.accept() # 承受sleep(2)driver.quit() # 敞开浏览器confirm(确认信息)弹出框confirm(确认信息)弹出框,次要是让用户来确定是否要执行某个操作。比方,淘宝,京东等,删除订单是弹出此类弹出,让用户确定是否删除,防止用户误操作。 confirm(确认信息)弹出框提供两种抉择,“确认” 或者 “勾销”。只须要抉择其中一个即可: 确认:WebDriver.switch_to.alert.accept()勾销:WebDriver.switch_to.alert.dismiss() from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("http://sahitest.com/demo/confirmTest.htm") # 跳转至测试页面sleep(1)element = driver.find_element_by_name("b1") # 定位# 1、承受element.click() # 点击sleep(1)alert = driver.switch_to.alert # 切换到弹窗print(alert.text) # 打印弹窗显示的信息:Alert Messagealert.accept() # 承受sleep(2)# 2、勾销element.click() # 点击sleep(1)alert = driver.switch_to.alert # 切换到弹窗print(alert.text) # 打印弹窗显示的信息:alert.dismiss()sleep(2)driver.quit() # 敞开浏览器prompt(提醒输出)弹出框prompt(提醒输出)弹出框,目标是须要用户先输出信息,再做提交。Selenium 提供输出信息的办法是: ...

August 6, 2020 · 1 min · jiezi

关于selenium:Selenium-窗口切换

在浏览网页的时候,有时点击一个链接或者按钮,会弹出一个新的窗口。 应用 Selenium 进行 Web 自动化测试,如果弹出新窗口时,没有对窗口进行切换,那么,WebDriver 对象 的焦点对应的,仍然是旧窗口,后续的自动化操作,将持续在旧窗口中进行。 实例验证: # 模仿场景:关上百度,点击左上角“视频”链接,打印出以后`WebDriver 对象` 对应的窗口信息from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]") # 定位“视频”元素element.click() # 点击sleep(1)print(driver.title) # 百度一下,你就晓得print(driver.current_url) # https://www.baidu.com/driver.quit() # 敞开浏览器依据程序的打印后果可知,窗口仍然停留在百度首页,以后的 url :https://www.baidu.com/,由此可推断,Selenium 没有依照咱们预期那样,主动切换到新的窗口。 思考到后续的操作步骤都须要在新窗口进行,就须要对进行窗口切换,Selenium 提供的窗口切换办法是: WebDriver.switch_to.window()WebDriver 对象有 window_handles 属性,返回一个列表,外面记录了以后浏览器所有的窗口句柄。 句柄:对应窗口的 id# 获取以后浏览器上所有窗口句柄from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]") # 定位“视频”元素element.click() # 点击sleep(1)print(driver.current_window_handle) # 以后浏览器句柄:CDwindow-1FABF3D9B0B190F9883E66F25481738Eprint(driver.window_handles) # 获取所有句柄:['CDwindow-1FABF3D9B0B190F9883E66F25481738E', 'CDwindow-0871993F618FDBE540426562AEA2FB32']for handle in driver.window_handles: print(handle)driver.quit() # 敞开浏览器因为 window_handles 返回的是一个列表,所以,能够通过列表下标来更换以后浏览器的窗口句柄,来实现窗口的自在切换: ...

August 6, 2020 · 1 min · jiezi

关于selenium:Selenium-3种等待方式

退出等待时间,次要是思考到网页加载须要工夫,可能因为网速慢,或者应用了 ajax 技术实现了异步加载等,如果程序找不到指定的页面元素,就会导致报错产生。 罕用的有3种期待形式: 强制期待隐式期待显示期待强制期待应用 Python 本身的库 time.sleep() 能够实现强制期待。 强制期待应用简略,然而,当网络条件良好的时候,倡议缩小应用,因为如果频繁应用强制期待的形式期待元素加载,会导致整个我的项目的自动化工夫缩短。 这种期待形式的应用场景次要是脚本调试。 隐式期待隐式期待实际上是,设置了一个最长的等待时间,如果在这段时间内可能定位到指标,则执行下一步操作,否则会统一等到规定工夫完结,而后再执行下一步。 隐式期待设置一次,对整个 driver 周期都可能起作用,所以,在最开始设置一次即可。 留神:在同一个 driver 周期中遇到强制期待,可能会导致隐式期待生效# 隐式期待,京东的“新人福利”from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.jd.com/") # 跳转至京东driver.implicitly_wait(10) # 隐式期待 10selement = driver.find_element_by_xpath("//*[@class='user_profit_lk']") # 定位元素element.click() # 点击sleep(3)driver.quit() # 敞开浏览器显式期待WebDriverWait 是 Selenium 提供的显式期待的模块,应用原理是:在指定的工夫范畴内,期待到合乎/不合乎某个条件为止。 导入形式: from selenium.webdriver.support.wait import WebDriverWaitWebDriverWait 参数: 序号参数形容1driver传入的 WebDriverWait 实例2timeout超时工夫,期待的最长工夫3poll_frequency调用 until 或 until_not 中的办法的间隔时间(默认是0.5秒)4ignored_exceptions疏忽的异样WebDriverWait 模块含有两个办法: untiluntil_notuntil 与 until_not 的参数: 序号参数形容1method在期待期间,每隔一段时间调用这个传入的办法,直到返回值不为 False2message如果超时,抛出 TimeoutException,将 message 传入异样通常状况下,WebDriverWait 模块会与 expected_conditions 模块搭配应用,用来写入 until 与 until_not 中的参数——method。 ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-3种等待方式

退出等待时间,次要是思考到网页加载须要工夫,可能因为网速慢,或者应用了 ajax 技术实现了异步加载等,如果程序找不到指定的页面元素,就会导致报错产生。 罕用的有3种期待形式: 强制期待隐式期待显示期待强制期待应用 Python 本身的库 time.sleep() 能够实现强制期待。 强制期待应用简略,然而,当网络条件良好的时候,倡议缩小应用,因为如果频繁应用强制期待的形式期待元素加载,会导致整个我的项目的自动化工夫缩短。 这种期待形式的应用场景次要是脚本调试。 隐式期待隐式期待实际上是,设置了一个最长的等待时间,如果在这段时间内可能定位到指标,则执行下一步操作,否则会统一等到规定工夫完结,而后再执行下一步。 隐式期待设置一次,对整个 driver 周期都可能起作用,所以,在最开始设置一次即可。 留神:在同一个 driver 周期中遇到强制期待,可能会导致隐式期待生效# 隐式期待,京东的“新人福利”from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.jd.com/") # 跳转至京东driver.implicitly_wait(10) # 隐式期待 10selement = driver.find_element_by_xpath("//*[@class='user_profit_lk']") # 定位元素element.click() # 点击sleep(3)driver.quit() # 敞开浏览器显式期待WebDriverWait 是 Selenium 提供的显式期待的模块,应用原理是:在指定的工夫范畴内,期待到合乎/不合乎某个条件为止。 导入形式: from selenium.webdriver.support.wait import WebDriverWaitWebDriverWait 参数: 序号参数形容1driver传入的 WebDriverWait 实例2timeout超时工夫,期待的最长工夫3poll_frequency调用 until 或 until_not 中的办法的间隔时间(默认是0.5秒)4ignored_exceptions疏忽的异样WebDriverWait 模块含有两个办法: untiluntil_notuntil 与 until_not 的参数: 序号参数形容1method在期待期间,每隔一段时间调用这个传入的办法,直到返回值不为 False2message如果超时,抛出 TimeoutException,将 message 传入异样通常状况下,WebDriverWait 模块会与 expected_conditions 模块搭配应用,用来写入 until 与 until_not 中的参数——method。 ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-API鼠标与键盘事件

鼠标事件Selenium 中的鼠标事件被封装在 ActionChains 类中,导入形式: from selenium.webdriver.common.action_chains import ActionChains官网文档:selenium.webdriver.common.action_chains ActionChains 罕用的办法: 序号办法/属性形容1click(self, on_element=None)单击鼠标左键2click_and_hold(self, on_element=None)点击鼠标左键,不松开3context_click(self, on_element=None)点击鼠标右键4double_click(self, on_element=None)双击鼠标右键5drag_and_drop(self, source, target)拖拽到某个元素而后松开6drag_and_drop_by_offset(self, source, xoffset, yoffset)拖拽到某个坐标而后松开7key_down(self, value, element=None)按下键盘上的某个按键8key_up(self, value, element=None)松开键盘上的某个按键9move_by_offset(self, xoffset, yoffset)鼠标从以后地位挪动到某个坐标10move_to_element(self, to_element)鼠标挪动到某个元素11move_to_element_with_offset(self, to_element, xoffset, yoffset)挪动到间隔某个元素(左上角坐标)多少间隔的地位12perform(self)执行动作链中的所有动作13def release(self, on_element=None)在某个元素地位松开鼠标左键14send_keys(self, *keys_to_send)发送某个键到以后焦点的元素15send_keys_to_element(self, element, *keys_to_send)发送某个键到指定元素留神:当整个动作链编写实现之后,必须调用 perform() 办法来执行所有动作,否则动作不失效实例操作# 模仿事件:鼠标挪动到商品分类列表--食物,在二级分类列表中点击“小龙虾”from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.jd.com") # 跳转至京东首页sleep(2)element = driver.find_element_by_xpath("//li[@data-index='11']") # 挪动到的元素action = ActionChains(driver).move_to_element(element) # 动作:挪动鼠标到指定元素action.perform() # 执行所有动作sleep(2)target_element = driver.find_element_by_link_text("小龙虾") # 指标元素target_element.click() # 点击sleep(2)driver.quit()键盘事件Selenium 中的键盘事件被封装在 Keys 类中,导入形式: ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-APIWebElement-方法

对于 WebElement 对象的办法,罕用的如下表所示: 序号办法/属性形容1WebElement.click()单次点击2WebElement.send_keys()输出指定内容3WebElement.clear()清空输入框内容4WebElement.get_attribute()获取元素的属性值5WebElement.is_seleted()判断元素是否被选中,返回一个 bool 类型值6WebElement.is_enabled()判断元素是否可用,返回一个 bool 类型值7WebElement.is_displayed()判断元素是否可见,返回一个 bool 类型值8WebElement.value_of_css_property()获取元素的 css 属性值WebElement.click()对定位元素做单次点击操作。 WebElement.send_keys()向 input、text、password、submit等文本输出类型输出指定的内容。 WebElement.clear()清空输出内容。 from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_id("kw") # 定位搜寻输入框element.send_keys("自动化测试") # 向定位元素输出内容sleep(1)element.clear() # 清空输出内容sleep(1)element1 = driver.find_element_by_xpath("//div[@class='s_tab_inner']/a[4]")element1.click() # 点击定位元素sleep(3)driver.quit()WebElement.get_attribute()获取定位元素的属性值: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[5]")print(element.get_attribute("href")) # http://tieba.baidu.com/print(element.get_attribute("target")) # _blankprint(element.get_attribute("class")) # mnav c-font-normal c-color-tdriver.quit()WebElement.is_seleted()判断元素是否被选中,返回一个 bool 类型值。 ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-APIWebElement-方法

对于 WebElement 对象的办法,罕用的如下表所示: 序号办法/属性形容1WebElement.click()单次点击2WebElement.send_keys()输出指定内容3WebElement.clear()清空输入框内容4WebElement.get_attribute()获取元素的属性值5WebElement.is_seleted()判断元素是否被选中,返回一个 bool 类型值6WebElement.is_enabled()判断元素是否可用,返回一个 bool 类型值7WebElement.is_displayed()判断元素是否可见,返回一个 bool 类型值8WebElement.value_of_css_property()获取元素的 css 属性值WebElement.click()对定位元素做单次点击操作。 WebElement.send_keys()向 input、text、password、submit等文本输出类型输出指定的内容。 WebElement.clear()清空输出内容。 from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_id("kw") # 定位搜寻输入框element.send_keys("自动化测试") # 向定位元素输出内容sleep(1)element.clear() # 清空输出内容sleep(1)element1 = driver.find_element_by_xpath("//div[@class='s_tab_inner']/a[4]")element1.click() # 点击定位元素sleep(3)driver.quit()WebElement.get_attribute()获取定位元素的属性值: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[5]")print(element.get_attribute("href")) # http://tieba.baidu.com/print(element.get_attribute("target")) # _blankprint(element.get_attribute("class")) # mnav c-font-normal c-color-tdriver.quit()WebElement.is_seleted()判断元素是否被选中,返回一个 bool 类型值。 ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-APIWebElement-属性

当咱们应用 Selenium 的定位办法定位到元素之后,会返回一个 WebElement 对象(<class 'selenium.webdriver.remote.webelement.WebElement'>),该对象用来形容 Web 页面上的一个元素,那么,对于元素的罕用属性,次要有: 序号办法/属性形容1WebElement.id获取元素的标示2WebElement.size获取元素的宽与高,返回一个字典3WebElement.rect除了获取元素的宽与高,还获取元素的坐标4WebElement.tag_name获取元素的标签名称5WebElement.text获取元素的文本内容WebElement.id获取元素的标示: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_id("kw") # 定位搜寻输入框print(element.id) # 25c961a3-4d39-4e67-b1f6-b72c89058a29driver.quit() # 敞开浏览器WebElement.size获取元素的宽与高,返回一个字典类型数据: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_id("kw") # 定位搜寻输入框print(element.size) # {'height': 44, 'width': 548}driver.quit() # 敞开浏览器WebElement.rect获取元素宽与高的同时,还获取元素的坐标,同样返回的是一个字典类型数据: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://www.baidu.com/") # 跳转至百度首页sleep(1)element = driver.find_element_by_id("kw") # 定位搜寻输入框print(element.rect) # {'height': 44, 'width': 548, 'x': 633, 'y': 222.234375}driver.quit() # 敞开浏览器WebElement.tag_name获取元素的标签名称: ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-APIWebDriver-方法

对于罕用的 WebDriver 办法,次要是回退、后退、刷新敞开浏览器等 序号办法/属性形容1driver.back()浏览器页面后退2driver.forword()浏览器页面后退3driver.refresh()刷新以后浏览器页面4driver.maximize_window()使浏览器窗口最大化5driver.set_window_size()设置浏览器窗口为指定尺寸6driver.close()敞开以后窗口7driver.quit()退出浏览器driver.back()浏览器页面后退: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://juejin.im/") # 跳转至掘金首页sleep(1)driver.find_element_by_xpath("//a[@href='/topics']").click() # 跳转至话题页面sleep(2)driver.back() # 浏览器页面回退sleep(2)driver.quit() # 敞开浏览器driver.forword()浏览器页面后退: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("https://juejin.im/") # 跳转至掘金首页sleep(1)driver.find_element_by_xpath("//a[@href='/topics']").click() # 跳转至话题页面sleep(2)driver.back() # 浏览器页面回退sleep(2)driver.forward() # 浏览器页面后退sleep(2)driver.quit() # 敞开浏览器driver.refresh()刷新以后浏览器页面: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("http://news.baidu.com/") # 跳转至百度新闻sleep(1)driver.refresh()sleep(2)driver.quit() # 敞开浏览器driver.maximize_window()使浏览器窗口最大化 driver.set_window_size()设置浏览器窗口为指定尺寸: ...

August 5, 2020 · 1 min · jiezi

关于selenium:Selenium-APIWebDriver-属性

关上浏览器,可能定位的内容都在 HTML 代码段内的 <body>页面内容</body> 中,对于浏览器上的以后页面题目,url等,都是无奈通过元素定位来操作的。 故此,有特定的 WebDriver 属性来实现这一类的操作。 序号办法/属性形容1driver.title获取以后页面的题目2driver.current_url获取以后页面的链接地址3driver.name获取浏览器名称4driver.page_source获取以后页面源码5driver.current_window_handle获取以后窗口句柄6driver.window_handles获取以后窗口所有句柄driver.title获取以后页面的题目: from selenium import webdriverdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至百度title = driver.title # 将以后页面的题目赋值给 titleprint("以后网页题目是:{}".format(title)) # 以后网页题目是:百度一下,你就晓得driver.quit() # 敞开浏览器driver.current_url获取以后页面的链接地址(url): from selenium import webdriverdriver = webdriver.Chrome() # 关上浏览器driver.get("https://www.baidu.com/") # 跳转至百度url = driver.current_url # 将以后页面的url赋值给 titleprint("以后网页url是:{}".format(url)) # 以后网页url是:https://www.baidu.com/driver.quit() # 敞开浏览器driver.name获取浏览器名称: from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 关上浏览器driver.maximize_window() # 浏览器最大化driver.get("http://news.baidu.com/") # 跳转至百度新闻sleep(1)name = driver.name # 获取浏览器名print(name) # chromesleep(2)driver.quit() # 敞开浏览器driver.page_source获取以后页面源码: ...

August 5, 2020 · 1 min · jiezi

关于selenium:selenium-定位方式4xpath

Selenium 提供的另一种,可能惟一定位的形式: find_element_by_xpathXPath 基础知识XPath (XML Path Language) 是由国际标准化组织 W3C 指定的,用来在 XML 和 HTML 文档中抉择节点的语言。XPath 学习链接 目前支流浏览器 (Chrome,Firefox,Edge,Safari) 都反对 XPath 语法。 XPath 绝对于 css 选择器的劣势: 有些场景应用 css 定位元素很麻烦,而 XPath 却比拟不便XPath 还有其余畛域会应用到,比方爬虫框架 Scrapy, 手机 APP 框架 AppiumXPath 语法中,整个 HTML 代码的根节点,应用 / 示意,这第一点跟 Linux 有相似之处。 定位根节点下的 html 节点:/html定位根节点下 body 节点下的 form 节点:/html/body/form 通过下面两个简略的例子可发现, XPath 中的 / 与 css 选择器中的 > 性能类似,都示意间接子节点关系 依据绝对路径定位元素示意从 XPath 根节点/ 开始,始终通过查找子元素的形式,定位到指定的元素,就是绝对路径。 理论利用 在上图中,定位百度首页的搜寻输入框,通过 /html/body/div/div/div/div/div/form/span/input 最终定位到2个元素,因而最初须要应用下标的形式,达到惟一定位的作用。 ...

August 4, 2020 · 2 min · jiezi

关于selenium:selenium-定位方式3cssselector

对于页面元素定位,能够依据 id、class、name 属性以及 link_text。 其中 id 属性是最现实的定位形式,class 与 name 属性,有时候也还行。 然而,如果要定位的元素,没有上述的属性,或者通过上述属性找到多个元素,该怎么办? Selenium 提供了2种能够惟一定位的形式: find_element_by_css_selectorfind_element_by_xpathfind_element_by_css_selector原理HTML 中常常要为页面上的元素指定显示成果,比方前景文字色彩是红色,背景色彩是彩色, 字体是微软雅黑,输入框的宽与低等。 以上这所有,都是靠 css 来通知浏览器:要抉择哪些元素, 显示怎么的格调。 如下图,豆瓣上“登陆豆瓣”的按钮,就是 css 通知浏览器:.account-anonymous .account-form-field-submit .btn 这个按钮,背景色彩是浅绿色,高是34px 等 其中,.account-anonymous .account-form-field-submit .btn 就是 css selector ,也称为 css 选择器。 css selector 语法就是用来抉择元素的。 既然 css selector 语法 天生就是浏览器用来抉择元素的,Selenium 天然就能够将它使用到自动化中,来定位要操作的元素了。 只有 css selector 的语法是正确的, Selenium 就能够定位到指定的元素。 依据标签(tag)名定位HTML 中,以下都属于标签: <a></a><div></div><h1></h1><script></script><body></body><span></span><footer></footer><input><form></form><button></button> 验证与搜寻形式: 按 F12 关上 开发者工具栏按 Ctrl 键 和 F 键, 显示搜寻框 利用: ...

August 4, 2020 · 3 min · jiezi

关于selenium:selenium-定位方式1

Selenium 罕用的定位形式8种。 1. find_element_by_id对于 Web 页面,id 是最现实的定位形式,个别前端 HTML 代码都会尽量保障 id 的唯一性。 1.1 find_element_by_id 利用# find_element_by_id 的利用1:定位百度输入框from selenium import webdriver # 导入 webdriver 模块from time import sleep # 导入 sleep 模块,能够使程序强制休眠driver = webdriver.Chrome() # 调用 Chrome 浏览器driver.get('https://www.baidu.com') # 关上百度网站kw_element = driver.find_element_by_id("kw") # 通过 id 属性定位到输入框kw_element.send_keys("selenium") # 向输入框写入"selenium"sleep(5) # 强制休眠 5 秒driver.quit() # 敞开浏览器# find_element_by_id 的利用2:定位中国知网首页的搜寻输入框driver = webdriver.Chrome() # 调用 Chrome 浏览器driver.get('https://www.cnki.net/') # 关上中国知网search_element = driver.find_element_by_id("txt_SearchText") # 通过 id 属性定位到搜寻输入框search_element.send_keys("自动化测试") # 输出内容sleep(5) # 强制休眠 5 秒driver.quit() # 敞开浏览器2. find_element_by_name通过 HTML 代码中的 name 属性来定位元素。 name 属性的值有可能不是惟一的,这时,会找到多个元素,遇到此类情况,程序会优先选择第一个定位元素。 ...

August 3, 2020 · 2 min · jiezi

关于selenium:selenium-定位方式1

Selenium 罕用的定位形式8种。 1. find_element_by_id对于 Web 页面,id 是最现实的定位形式,个别前端 HTML 代码都会尽量保障 id 的唯一性。 1.1 find_element_by_id 利用# find_element_by_id 的利用1:定位百度输入框from selenium import webdriver # 导入 webdriver 模块from time import sleep # 导入 sleep 模块,能够使程序强制休眠driver = webdriver.Chrome() # 调用 Chrome 浏览器driver.get('https://www.baidu.com') # 关上百度网站kw_element = driver.find_element_by_id("kw") # 通过 id 属性定位到输入框kw_element.send_keys("selenium") # 向输入框写入"selenium"sleep(5) # 强制休眠 5 秒driver.quit() # 敞开浏览器# find_element_by_id 的利用2:定位中国知网首页的搜寻输入框driver = webdriver.Chrome() # 调用 Chrome 浏览器driver.get('https://www.cnki.net/') # 关上中国知网search_element = driver.find_element_by_id("txt_SearchText") # 通过 id 属性定位到搜寻输入框search_element.send_keys("自动化测试") # 输出内容sleep(5) # 强制休眠 5 秒driver.quit() # 敞开浏览器2. find_element_by_name通过 HTML 代码中的 name 属性来定位元素。 name 属性的值有可能不是惟一的,这时,会找到多个元素,遇到此类情况,程序会优先选择第一个定位元素。 ...

August 3, 2020 · 2 min · jiezi

关于selenium:selenium-环境搭建

Selenium 环境的装置次要就是装置两样货色: Selenium 客户端库和浏览器 驱动(WebDriver) 本文是以 Python 及 Chrome 浏览器为例,解说 Selenium 环境的搭建。 如果感觉下载网速慢,以下的网盘链接整顿了搭建所需的软件: selenium 环境搭建--提取码:sese Python 装置在搭建 Selenium 环境之前,提前装置好 Python。可参考: Python如何装置 Python官网下载地址 装置Python须要留神的中央: 将 Python 执行文件所在门路增加到环境变量中 将 pip.exe 所在门路增加到环境变量中,这波及到 selenium 库的装置 Selenium 库的装置一句命令就能解决! Windows 零碎下,关上 cmd 窗口,输出pip install selenium 敲回车即可。 如果下载速度太慢,更换下载源即可,输出命令:pip install selenium -i https://pypi.doubanio.com/simple/ 敲回车即可。 同样,也能够应用 Pycharm 的 Terminal 输出命令,这个能够用起来,性能跟 cmd 一样,编程时会显得更不便。 测验是否曾经装置胜利的命令:pip show selenium,如果呈现版本号等信息,阐明装置胜利了。 浏览器驱动(WebDriver)Chrome 浏览器驱动:chromedriver.exe,下载地址 留神:如果运行时报错,请查看浏览器版本 Firefox 浏览器驱动:geckodriver.exe,下载地址Edge 浏览器驱动:msedgedriver.exe,下载地址浏览器驱动下载实现后,怎么应用? ...

August 3, 2020 · 1 min · jiezi

关于selenium:Selenium-简介

Selenium 是一个 Web 利用的自动化框架。次要利用于 Web 应用程序的自动化测试。 通过它,测试工程师能够写出自动化程序,模仿人在浏览器里操作 Web 界面。 比方点击界面按钮,在文本框中输出文字等操作。 除此以外,它还反对所有基于 Web 的治理工作自动化。 Selenium 官网 Selenium 的特点开源收费:基于这点,可能吸引大部分公司违心应用它来作为自动化测试的框架多浏览器反对:反对 Chrome、Firefox、IE、Edge、Safari 等浏览器多平台反对:反对 Linux、Windows、Mac 零碎平台多语言反对:反对 Java、Python、Ruby、JavaScript、C++ 等开发语言对 Web 页面有良好的反对简略、灵便:应用时调用的 API 简略,只须要应用开发语言导入调用即可反对分布式测试:应用 Selenium Grid反对录制、回放与脚本生成:应用 Selenium IDESelenium 的历史版本Selenium 经验了3个版本,Selenium 1.X、Selenium 2.X 以及目前的 Selenium 3.X。 其中 Selenium 1.X 与 Selenium 2.X 最大的区别在于 WebDriver。 WebDriver 已经是 Selenium 的竞争对手,能补救 Selenium 1.X 存在的有余。 而 Selenium 2.X 则是 Selenium 与 WebDriver 两个我的项目的合并,也就是说,Selenium 2.X = Selenium 1.X + WebDriver。 ...

August 3, 2020 · 1 min · jiezi

关于selenium:关于Web端UI自动化测试

在手工测试阶段,针对我的项目输入了测试用例,如果这些测试用例须要在版本迭代的过程中,须要进行回归测试,通过手工反复地执行测试用例,将会消耗大量的人力。 为此应运而生就有了自动化测试,通过应用自动化工具,将依照测试用例进行点点操作,校验的工作,交给代码程序来执行,测试工作,就变得省心省力了。 重点:测试用例是自动化测试脚本的根据,所有不基于测试用例而写的自动化脚本都是耍流氓。对于UI自动化测试UI 自动化的实质:定位元素操作元素模仿页面动作断言后果生成报告基于以上5个实质,自动化测试的整体流程是这样的,这里百度登陆性能的测试用例为例: 对于这条测试用例,须要找到它的定位元素:用户名输入框,明码输入框,登陆按钮操作元素:对于这3个定位元素的操作有2种,别离是“输出”与“点击”模仿页面动作,也就是测试用例的步骤: 输出用户名输出明码点击登陆按钮判断后果:将用例中的预期后果与理论后果进行比对,如果统一,代表胜利,否则代表失败。对于这条测试用例,登陆胜利的标记是,页面右上角呈现了用户的头像与用户名,那么,能够通过获取网页中用户名的文本信息,与登录账户的用户名比照,统一的话,代表这条用例通过。依据执行后果,主动生成报告,罕用的第三方模块:HtmlTestRunner,Allure2 等适宜UI自动化测试的场景当然,不是所有的测试场景都适宜用自动化测试来实现。 对此,能够参考以下的规范辅助判断: 我的项目的需要不会频繁变动页面的 UI 曾经进入稳固阶段我的项目周期足够长大量回归的测试工作其中,有一些我的项目是显著不适宜应用 UI 自动化测试的,例如视频播放器(暴风影音,腾讯视频,爱奇艺等),音乐播放器(例如网易云音乐,QQ 音乐等)等交动性强,并发依赖强的软件。 起因是,这一类软件,判断视频内容对不对,判断音乐声音与歌词对不对,难度极大。 另外,延长一个话题:对于自动化测试的覆盖率,面试会问到的一个点。 国内大多数互联网公司的我的项目迭代周期比拟短,因而自动化覆盖率个别都不高。 具体还是要依据我的项目迭代周期进行形容,参考规范是: 迭代周期是半年或者一年以上的我的项目,每次需要变动很少,自动化测试的覆盖率个别是60%-70%,次要是笼罩之前的旧性能以及外围场景迭代周期为一个月的我的项目, 覆盖率大略是25-30%,次要是笼罩 P0(极重要)级别的绝大多数用例,与 P1(重要)级别中的局部用例1~2周一个迭代的我的项目,覆盖率大略是10%,次要是笼罩 P0(极重要)级别,可能会对用户造成重大影响的外围场景其次,UI 自动化测试的工夫切入点次要有2个: 冒烟测试阶段回归测试阶段UI 自动化测试设计准则一个测试用例实现一个性能点测试(罕用):一个手工用例对应一个自动化测试用例一个脚本是一个残缺的场景脚本之间独立,不能有依赖(脚本间互相隔离):例如与登陆状态相干的用例:集体核心、订单详情、下单购物等,如果脚本之间不独立,相互依赖,在登陆的测试脚本失败的状况下,会导致集体核心、订单详情、下单购物的测试脚本全军覆灭,后续修复与保护老本高设置适合的检查点:通过断言判断用例的胜利与否设计良好的框架:Python 罕用的测试框架有 unittest 与 pytest,利用框架,及对共用的测试模块进行封装,缩小自动化测试脚本保护的工作量总结

August 3, 2020 · 1 min · jiezi

关于selenium:关于Web端UI自动化测试

在手工测试阶段,针对我的项目输入了测试用例,如果这些测试用例须要在版本迭代的过程中,须要进行回归测试,通过手工反复地执行测试用例,将会消耗大量的人力。 为此应运而生就有了自动化测试,通过应用自动化工具,将依照测试用例进行点点操作,校验的工作,交给代码程序来执行,测试工作,就变得省心省力了。 重点:测试用例是自动化测试脚本的根据,所有不基于测试用例而写的自动化脚本都是耍流氓。对于UI自动化测试UI 自动化的实质:定位元素操作元素模仿页面动作断言后果生成报告基于以上5个实质,自动化测试的整体流程是这样的,这里百度登陆性能的测试用例为例: 对于这条测试用例,须要找到它的定位元素:用户名输入框,明码输入框,登陆按钮操作元素:对于这3个定位元素的操作有2种,别离是“输出”与“点击”模仿页面动作,也就是测试用例的步骤: 输出用户名输出明码点击登陆按钮判断后果:将用例中的预期后果与理论后果进行比对,如果统一,代表胜利,否则代表失败。对于这条测试用例,登陆胜利的标记是,页面右上角呈现了用户的头像与用户名,那么,能够通过获取网页中用户名的文本信息,与登录账户的用户名比照,统一的话,代表这条用例通过。依据执行后果,主动生成报告,罕用的第三方模块:HtmlTestRunner,Allure2 等适宜UI自动化测试的场景当然,不是所有的测试场景都适宜用自动化测试来实现。 对此,能够参考以下的规范辅助判断: 我的项目的需要不会频繁变动页面的 UI 曾经进入稳固阶段我的项目周期足够长大量回归的测试工作其中,有一些我的项目是显著不适宜应用 UI 自动化测试的,例如视频播放器(暴风影音,腾讯视频,爱奇艺等),音乐播放器(例如网易云音乐,QQ 音乐等)等交动性强,并发依赖强的软件。 起因是,这一类软件,判断视频内容对不对,判断音乐声音与歌词对不对,难度极大。 另外,延长一个话题:对于自动化测试的覆盖率,面试会问到的一个点。 国内大多数互联网公司的我的项目迭代周期比拟短,因而自动化覆盖率个别都不高。 具体还是要依据我的项目迭代周期进行形容,参考规范是: 迭代周期是半年或者一年以上的我的项目,每次需要变动很少,自动化测试的覆盖率个别是60%-70%,次要是笼罩之前的旧性能以及外围场景迭代周期为一个月的我的项目, 覆盖率大略是25-30%,次要是笼罩 P0(极重要)级别的绝大多数用例,与 P1(重要)级别中的局部用例1~2周一个迭代的我的项目,覆盖率大略是10%,次要是笼罩 P0(极重要)级别,可能会对用户造成重大影响的外围场景其次,UI 自动化测试的工夫切入点次要有2个: 冒烟测试阶段回归测试阶段UI 自动化测试设计准则一个测试用例实现一个性能点测试(罕用):一个手工用例对应一个自动化测试用例一个脚本是一个残缺的场景脚本之间独立,不能有依赖(脚本间互相隔离):例如与登陆状态相干的用例:集体核心、订单详情、下单购物等,如果脚本之间不独立,相互依赖,在登陆的测试脚本失败的状况下,会导致集体核心、订单详情、下单购物的测试脚本全军覆灭,后续修复与保护老本高设置适合的检查点:通过断言判断用例的胜利与否设计良好的框架:Python 罕用的测试框架有 unittest 与 pytest,利用框架,及对共用的测试模块进行封装,缩小自动化测试脚本保护的工作量总结

August 3, 2020 · 1 min · jiezi

关于selenium:python自动爬取百度搜索结果

python版本:3.8pip install BeautifulSoup4pip install selenium pip install requests from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom bs4 import BeautifulSoupimport time import requests#抉择浏览器驱动(还能够抉择webdriver.Firefox;webdriver.Ie;相干浏览器的驱动须要自行下载)driver = webdriver.Chrome(executable_path="F:\code\简书\chromedriver")driver.get("http://www.baidu.com")#下一行是用assert的形式确认题目是否蕴含“Python”一词assert "百度" in driver.title#如果某些元素不是立刻可用的,隐式期待是通知WebDriver去期待肯定的工夫后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式期待是设置该WebDriver的实例的生命周期。driver.implicitly_wait(5) # seconds#在浏览器搜寻栏插入pythondriver.find_element_by_id('kw').send_keys('python')# 模仿回车操作 ,开始搜寻driver.find_element_by_id('su').send_keys(Keys.ENTER)driver.implicitly_wait(3) # seconds#此处如果不sleep,上面获取到的数据可能为空 (https://blog.csdn.net/manmanxiaowugun/article/details/89646135)time.sleep(3)# 应用BeautifulSoup解析搜寻后果#bsobj = BeautifulSoup(driver.page_source, features="html.parser")# 获取搜寻后果队列#search_results = bsobj.find_all('div', {'class': 'result c-container'})"""此处应用的是find_elements_by_css_selector,依据其右键“下一页”的查看获取到其js path并进行批改:document.querySelector("#page > div > a:nth-child(12)")pop() 函数用于获取列表中的一个元素(默认为最初一个元素),并且返回该元素 的值。pop()或 pop(-1)默认获取一组元素中的最初一个driver.find_elements_by_css_selector("#page > div > *").pop().click()driver.find_element_by_css_selector("#page > div > a.[nth-last-child(1)]")不知为何不失效???????????"""def get_real_url(url): try: #如果不设置timeout,会导致上面出后果较慢,超时后间接返回百度的链接(example:http://www.baidu.com/link?url=TMx1usYKo-ncZAXpBq4rjaJ535T9G78lQyuxANxqHAQ9Ckwt7JVh4s89C1yEJ6a7vsGuef6Qa2dWMuXinJnpBa) real_url=requests.get(url, timeout=1).url return real_url except: return url#取前两页的题目和链接地址for i in range(2): driver.implicitly_wait(3) # seconds bsobj = BeautifulSoup(driver.page_source, features="html.parser") search_results = bsobj.find_all('div', {'class': 'result c-container'}) for iteam in search_results: print (iteam.h3.a.get_text(strip=True) + " " + get_real_url(iteam.h3.a.get('href'))) #刷新以后页面要不然获取下一页元素是会报错(" stale element reference: element is not attached to the page document" 古老元素援用:元素没有附加到页面文档中) print ('\n') driver.refresh() driver.find_elements_by_css_selector("#page > div > *").pop().click()"""当你向通过CSS选择器查找元素时应用这个。 在该策略下,页面中第一个匹配该CSS 选择器的元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException 异样。作为示例,页面元素如下所示:<html> <body> <p class="content">Site content goes here.</p></body><html>"""#driver.find_element_by_css_selector('div.result')"""#test用time.sleep(5)#实例化函数elem = driver.find_element_by_id('kw')#清空搜索项elem.clear()#插入搜寻我的项目elem.send_keys("pycon")#回车elem.send_keys(Keys.RETURN)assert "No results found." not in driver.page_source"""driver.close()最终输入后果:对于页面元素的获取: ...

August 1, 2020 · 1 min · jiezi