关于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

Node-使用-Selenium-进行前端自动化操作

Node 使用 Selenium 进行前端自动化操作前言:最近项目中有类似的需求:需要对前端项目中某一个用户下的产品数据进行批量的处理。手动处理的流程大概是首先登录系统,获取到当前用户下的产品列表,点击产品列表的中产品项进入详情页,对该产品进行一系列的操作,然后保存退出。因为当前有20多万条数据,手动一条一条的处理不太现实,所以希望通过写脚本的方式来进行处理。需求分析其实这个需求还算比较简单,需要实现的点主要有三个,一是如何进行登录,获取登录信息,查询当前用户下的产品数据;二是如何知道当前数据是否处理完,然后退出当前的处理流程;三是如何异步的处理一批数据。 所以需要做的工作就是模拟登录,调用产品列表的查询接口获取产品ID集合,然后循环遍历当前的集合,通过产品ID跳转产品详情页面,模拟页面按钮的点击操作,监听处理完成的动作,退出当前的流程。 Selenium 介绍What is Selenium?Selenium automates browsers. That's it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) be automated as well.Selenium has the support of some of the largest browser vendors who have taken (or are taking) steps to make Selenium a native part of their browser. It is also the core technology in countless other browser automation tools, APIs and frameworks.翻译过来大致意思就是: Selenium 可以自动化操作浏览器。怎么去使用Selenium 的功能完全取决于我们自己。它主要还是使用在web应用的自动化测试上。但是他的功能并不仅限于此。那些枯燥的基于web的管理任务也可以自动化。很多流行的浏览器都采取了一些措施来支持Selenium实现本地化。它也是很多浏览器自动化工具、API自动化以及框架的核心技术。 ...

October 9, 2019 · 2 min · jiezi

如何避免Puppeteer被前端JS检测

这两天开始看puppeteer,发现居然也能被前端js检测出来!?github的issue区找了找,原来puppeteer启动的chrome里面,是有navigator.webdriver属性的,搞什么搞么,老外真是做那啥还要立牌坊Orzissue里也看到了解决方案: await this.page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); }但是说实话这个还是有点问题的,因为用"webdriver" in navigator还是能检测出来。想找找到底哪个环节把"webdriver"属性加上的,但是文本搜索发现puppeteer源码中并没有……后来发现是启动chrome的默认参数列表中有"--enable-automation"……找了一下这个命令行参数的说明: --enable-automation: Inform users that their browser is being controlled by an automated test.妈蛋纯粹是立牌坊用的,其它毛用没有……确认了就可以干掉它了,启动chrome时加个忽略默认参数即可: const browser = await puppeteer.launch({ignoreDefaultArgs: ["--enable-automation"]});

June 20, 2019 · 1 min · jiezi

达观数据Selenium使用技巧与机器人流程自动化实战

背景北京时间晚上十一点,突然电脑右下角的QQ弹出了一条消息,"在?" 都9012年了还会有人单独发个"在"然后人就失踪了?有事情找就直接说事情嘛,你不说事情,我怎么知道我应该"在"还是应该"不在"呢? 鼠标移动到右下角准备点击"取消闪烁"时发现,是小美。 感觉空气中突然弥漫着一种说不明的东西,还是忍不住回复了一句,"在,什么事情?" "你明天下午一点方便使用电脑吗?" 唉,有什么事情为什么不可以一口气说完呢,为什么总要说半句呢,如果我在这个人面前我肯定一个大嘴巴子上去了。但,这是小美。"方便"。 "我明天选修课要抢课,你方便的话帮我一下呗,我和朋友约了出去玩了。" 果不其然,在我学会了如何修电脑、如何恢复数据、如何下载视频等技能后,又有新的技能树即将需要被点亮。不过区区抢选修课能难到我?我不仅要抢到,还要抢得漂亮,抢得安逸,抢得让自己都佩服! "No problem!抢课地址,账号,密码,课程名。" 这干脆利落的语气,完美。 需求分析抢课只是一件小事,无非是打开浏览器,等时间到了疯狂点击。但想必大多数人都在大学时候有过惨痛的经历,无外乎学校网络太差,热门课程抢的人数太多自己不一定能抢到。同样,我也并不能保证自己在第二天下午一点的时候盯着屏幕不停地点,或者舒服一点用鼠标连点器不停地点,就能很大可能地抢到需要的课程。 学校的网络没法拯救,只能拯救自身的网络;抢同一门课程的人数多,我们就需要开更多的窗口去抢! 很好,看来我们需要搞定一段自动抢课的代码,然后在自己机器上部署、在舍友机器上部署、在云环境部署、在网络好的其他机器部署,想必这总能最大可能性抢到想要的课程了吧。 我仿佛看到了一个幕后黑手看着自己的屏幕嘿嘿嘿地笑着: 王小明 世界电子竞技 抢课中...吴小杰 芭蕾舞艺术 抢课成功陈小龙 基础烹饪知识 抢课成功刘小乡 莎士比亚戏剧选 抢课中...... 抢课,我从来没怕过谁。 方案设计本文只着重介绍selenium相关使用,不会对整个方案进行完整的实现 此前在学习python爬虫的时候接触过selenium的知识,完全可以适配这样浏览器操作场景。 可以先用selenium写一个操作浏览器抢课的脚本,再用flask来接收外部的请求命令执行对应的抢课脚本,用docker打包成镜像,再到能暂时操作的所有电脑,云服务器部署一套。 等快到抢课时间了,安安心心躺在椅子上,执行一下批量发送请求的脚本,就可以静待抢课成功的好消息了。 我只想发出三个字的声音:还!有!谁! selenium简介官网介绍 Selenium is a suite of tools to automate web browsers across many platforms. runs in many browsers and operating systems can be controlled by many programming languages and testing frameworks. Selenium 官网:http://seleniumhq.org/ Selenium Github 主页:https://github.com/SeleniumHQ/selenium百度百科Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。功能框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。使用简单,可使用Java,Python等多种语言编写用例脚本。简单来说,起初selenium是一套用于web自动化测试的工具,其本身具备了对多种浏览器/操作系统的兼容支持,且能通过多种语言进行操作控制。但其强大的功能不仅仅适用于web自动化测试领域,同样也被广泛地使用在爬虫以及rpa(Robotic Process Automation)相关的业务场景上。而我们现在需要实现的可以说就是一个简单的rpa功能。 ...

June 10, 2019 · 3 min · jiezi

给你的个人微信朋友圈数据生成一本电子书吧

[toc] 给你的个人微信朋友圈数据生成一本电子书吧!简介微信朋友圈保留着你的数据,它留住了美好的回忆,记录了我们成长的点点滴滴。发朋友圈从某种意义上来讲是在记录生活,感受生活,并从中看到了每个人每一步的成长。 这么一份珍贵的记忆,何不将它保存下来呢?只需一杯咖啡的时间,即可一键打印你的朋友圈。它可以是纸质书,也可以是电子书,可以长久保存,比洗照片好,又有时间足迹记忆。 这本书,可以用来:送给孩子的生日礼物送给伴侣的生日礼物送给未来的自己……现在,你可以选择打印电子书或者纸质书。打印纸质书的话,可以找第三方机构花钱购买;打印电子书的话,我们完全可以自己动手生成,这可以省下一笔不小的开支。 部分截图在开始写代码思路之前,我们先看看最终生成的效果。 电子书效果 纸质书效果 代码思路获取微信书链接看完效果图之后,开始进入代码编写部分。首先,由于朋友圈数据的隐私性较高,手动获取的话,需要使用root的安卓手机进行解密或对pc端备份的聊天记录数据库进行解密,这对大部分人来说难度较大。所以我们采取的思路是基于现有的数据进行打印电子书。 目前,已经有第三方服务支持导出朋友圈数据,微信公众号【出书啦】就提供了这样一种服务。这种服务很大可能性是基于安卓模拟器进行自动化采取操作的,具体就不详细讲了。 首先,关注该公众号,然后开始制作微信书。该过程为小编添加你为好友,然后你将朋友圈开放给他看,等一会后采集完毕后,小编会发给你一个专属链接,这个链接里面的内容就是你的个人朋友圈数据。 生成电子书有了这个链接后,我们开始对该页面的内容进行打印。 整个过程基于selenium自动化操作,如果你有了解过selenium的话,那么其实该过程是很简单的。 首先,引导用户输入微信书链接,我们采用在浏览器弹出一个输入文本框的形式让用户输入数据。首先,在selenium中执行js代码,js代码中完成弹出输入文本框的功能。 输入微信书链接# 以网页输入文本框形式提示用户输入url地址def input_url(): # js脚本 random_id = [str(random.randint(0, 9)) for i in range(0,10)] random_id = "".join(random_id) random_id = 'id_input_target_url_' + random_id js = """ // 弹出文本输入框,输入微信书的完整链接地址 target_url = prompt("请输入微信书的完整链接地址","https://"); // 动态创建一个input元素 input_target_url = document.createElement("input"); // 为其设置id,以便在程序中能够获取到它的值 input_target_url.id = "id_input_target_url"; // 插入到当前网页中 document.getElementsByTagName("body")[0].appendChild(input_target_url); // 设置不可见 document.getElementById("id_input_target_url").style.display = 'none'; // 设置value为target_url的值 document.getElementById("id_input_target_url").value = target_url """ js = js.replace('id_input_target_url', random_id) # 执行以上js脚本 driver.execute_script(js)上述js代码的具体步骤为:弹出一个输入文本框,创建一个动态元素,随机命名该元素的id,并将这个动态元素插入到当前页面中,使得可以在python中通过selenium获取到输入文本框的内容。 ...

June 7, 2019 · 2 min · jiezi

OpenCV搞定腾讯滑块验证码

前言废话滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码绕不开图像处理,图像处理当然是首推OpenCV-Python啦!当然我的OpenCV非常菜(P.S.两天速成不敢保证代码质量),发现问题就直接指出嘛,不用走流程啦! 环境首先需要一个python,然后安装opencv的python库,如下:pip install opencv-python然后测试一下是否可用,如下: import cv2 as cvimport numpy as npif __name__ == '__main__': img = np.ones((200, 200, 3), np.uint8) * 255 cv.rectangle(img, (50, 50), (150, 150), (0, 0, 255), 2) cv.imshow('test', img) cv.waitKey(0) cv.destroyAllWindows()正常的话就会如下显示: OpenCV的使用相关的API我也是边用边查的,用得也是相当生疏!具体的常用方法大家只好自行百度了,我就不献丑了! 实现原理及方法腾讯滑块验证这次搞得目标就是腾讯滑块验证码,调用腾讯滑块这个接口的网站还是挺多的,比如非常好用的在线画图网站ProcessOn,其中滑块验证部分类似这样子的: 抓个包发现只有滑块图和带缺口的图,如下:破解滑块验证码最为关键的地方在于找到滑块缺口的位置,找到缺口位置后就可以利用Selenium模拟拖动滑块到指定位置实现破解,之前的老办法就是将完整图的像素点和带缺口图的像素点进行比较从而得到缺口位置,但是现在一般不会将完整图暴露给我们,所以只有在带有缺口的图上进行处理。我这里一共有两种方案进行缺口位置识别,一种是基于模板匹配的,另一种是基于轮廓检测的,下面会细讲两种方案的实现方法。 模板匹配识别缺口具体是实现过程如下:1.处理滑块的图片 灰度化滑块图片处理一下滑块图中滑块的外圈使用inRange二值化滑块图使用开运算去除白色噪点运行结果如下所示(左侧为原始滑块,右侧为处理后的滑块): 2.处理带缺口的图片 先来个高斯滤波去噪灰度化带缺口图使用阈值二值化该图运行结果如下所示(左侧为原始图,右侧为处理后的图): 3.进行模板匹配调用模板匹配API并圈出匹配上的区域,结果如下所示: 警告警告警告这种方法的缺口识别率在50%左右,很大一部分原因是滑块图的背景为纯白色,这在匹配时会产生很大的干扰,要是能将滑块图的背景变为透明,正确的匹配率可以达到90%以上 如果大家有任何将滑块图的背景变为透明的办法,可以留言到评论区,我真的万分感谢!!!下面是现阶段的实现代码: # encoding:utf-8import cv2 as cvimport numpy as np# 对滑块进行二值化处理def handle_img1(image): kernel = np.ones((8, 8), np.uint8) # 去滑块的前景噪声内核 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) width, heigth = gray.shape for h in range(heigth): for w in range(width): if gray[w, h] == 0: gray[w, h] = 96 # cv.imshow('gray', gray) binary = cv.inRange(gray, 96, 96) res = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开运算去除白色噪点 # cv.imshow('res', res) return res# 模板匹配(用于寻找缺口有点误差)def template_match(img_target, img_template): tpl = handle_img1(img_template) # 误差来源就在于滑块的背景图为白色 blurred = cv.GaussianBlur(img_target, (3, 3), 0) # 目标图高斯滤波 gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) ret, target = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 目标图二值化 # cv.imshow("template", tpl) # cv.imshow("target", target) method = cv.TM_CCOEFF_NORMED width, height = tpl.shape[:2] result = cv.matchTemplate(target, tpl, method) min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result) left_up = max_loc right_down = (left_up[0] + height, left_up[1] + width) cv.rectangle(img_target, left_up, right_down, (0, 0, 255), 2) cv.imshow('res', img_target)if __name__ == '__main__': img0 = cv.imread('./demo/3/hycdn_3.jpg') img1 = cv.imread('./demo/3/hycdn_3_2.png') template_match(img0, img1) cv.waitKey(0) cv.destroyAllWindows()轮廓检测识别缺口基于轮廓检测缺口的思路简单很多,加上合理的条件识别率在95%以上,实现过程如下: ...

May 18, 2019 · 2 min · jiezi

selenuim鼠标键盘操作ActionChains

使用ActionChains之前必须先导入ActionChains from selenium.webdriver.common.action_chains import ActionChains

May 1, 2019 · 1 min · jiezi

Selenium-chromeDriver-Python3-完成-Flash-播放

在使用 selenium + chromeDriver + python3 截图时,遇上 Flash 无法加载,导致了截图 Falsh 是空白区。环境要求:selenium chromeDriver Python3 问题chrome 无头浏览器无法自动加载 Flash 解决办法参考了 allow-flash-content-in-chrome-69-running-via-chromedriver 的回答,直接修改 Chrome 的设置 chrome://settings/content/siteDetails?site= 里面的 Flash 设置,修改为 Allow #!/usr/bin/env python3# -*- coding: utf-8 -*-from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import Selectclass chromeDriver(): def __init__(self, driver = ''): # 设置窗口大小 self.window_width = 1680 self.window_height = 948 # 设置 chromedriver 位置 self.executable_path = '/usr/local/bin/chromedriver' # 设置 Flash 的路径 self.flash_path = '/Users/cindy/Library/Application Support/Google/Chrome/PepperFlash/32.0.0.171/PepperFlashPlayer.plugin' # 获取 driver if driver: self.driver = driver else: self.driver = self.get_chrome_driver() def get_chrome_driver(self): # 头部 user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' # 创建参数对象 options = webdriver.ChromeOptions() prefs = { # 开启图片 "profile.managed_default_content_settings.images":1, # 关闭 Notification "profile.default_content_setting_values.notifications": 2, } # 设置 Flash 的路径 options.add_argument('--ppapi-flash-version=32.0.0.171') options.add_argument('--ppapi-flash-path=' + self.flash_path) options.add_argument('binary_location=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome') # 指定屏幕分辨率 options.add_argument('window-size=' + str(self.window_width) + 'x' + str(self.window_height) + '\'') # 最大化窗口 options.add_argument('--start-maximized') # 规避bug options.add_argument('--disable-gpu') # 禁用弹出拦截 options.add_argument('--disable-popup-blocking') # 隐藏自动软件 options.add_argument('disable-infobars') # 设置中文 options.add_argument('lang=zh_CN.UTF-8') #忽略 Chrome 浏览器证书错误报警提示 options.add_argument('--ignore-certificate-errors') # 更换头部 options.add_argument('user-agent=' + user_agent) options.add_argument('no-default-browser-check') # 关闭特征变量 options.add_experimental_option('excludeSwitches', ['enable-automation']) options.add_experimental_option('prefs', prefs) # 创建 Chrome 对象 driver = webdriver.Chrome(options = options, executable_path = self.executable_path) return driver def get(self, web_url): if not web_url: return False return self.driver.get(web_url) def add_flash_site(self, web_url): if not web_url: return False self.get("chrome://settings/content/siteDetails?site=" + web_url) root1 = self.driver.find_element(By.TAG_NAME, "settings-ui") shadow_root1 = self.expand_root_element(root1) root2 = shadow_root1.find_element(By.ID, "container") root3 = root2.find_element(By.ID, "main") shadow_root3 = self.expand_root_element(root3) shadow_root3 = self.expand_root_element(root3) root4 = shadow_root3.find_element(By.CLASS_NAME, "showing-subpage") shadow_root4 = self.expand_root_element(root4) root5 = shadow_root4.find_element(By.ID, "advancedPage") root6 = root5.find_element(By.TAG_NAME, "settings-privacy-page") shadow_root6 = self.expand_root_element(root6) root7 = shadow_root6.find_element(By.ID, "pages") root8 = root7.find_element(By.TAG_NAME, "settings-subpage") root9 = root8.find_element(By.TAG_NAME, "site-details") shadow_root9 = self.expand_root_element(root9) root10 = shadow_root9.find_element(By.ID, "plugins") shadow_root10 = self.expand_root_element(root10) root11 = shadow_root10.find_element(By.ID, "permission") Select(root11).select_by_value("allow") def expand_root_element(self, element): return self.driver.execute_script("return arguments[0].shadowRoot", element) def get_flash_url(self, web_url): if not web_url: return False self.add_flash_site(web_url) self.get(web_url) def quit_driver(self): self.driver.quit()driver = chromeDriver()url = 'http://your.website/'driver.get_flash_url(url)最后不能使用无界面模式,设置 handless 参数 options.add_argument('--headless')。否则无法直接修改 Chrome 的设置。 ...

April 23, 2019 · 2 min · jiezi

前端为什么要学习 Selenium

翻译:疯狂的技术宅原文:https://www.edureka.co/blog/1...本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 如果你正在阅读本文,那么可能希望从手动测试升级为自动化测试。你是对的,因为你需要学习 Selenium。我这样说是因为自动化测试已经风靡全球,而且业界正很缺少 Selenium 认证专家。 你可能还想知道,怎样开始测试,以及 Selenium 是否适合入门。如果你有这些疑问,那么请不要担心,因为在本文中,我将给出 10 个令人信服的理由,来说明学习 Selenium 的必要性。 学习 Selenium 的十大理由是: 开源/免费工具无操作系统/浏览器要求支持多种编程语言框架的可用性在DevOps生命周期中的强势存在与其他工具轻松集成并行和分布式测试不依赖基于 GUI 的系统设计测试用例时的灵活性对 Selenium 测试人员的需求接下来详细解释每个理由。 1. 开源/免费工具 Selenium是一个开源工具,这意味着任何人都可以免费使用它。任何组织都可以使用 Selenium 来测试他们的网站或 Web 应用,甚至独立的程序员也可以用 Selenium WebDriver 学习和练习自动化测试。 其他测试工具的问题在于,它们是需要使用许可证的工具,或者它们的功能不如 Selenium。比如 HP 的 QTP、IBM 的 RFT、TestComplete、Ranorex都是专有(许可)工具。在功能上 Selenium 是明显的赢家,无人能出于其右! 2. 没有特殊的操作系统/浏览器/硬件要求这是 Selenium 带来的另一个好处。你不需要配有 16GB 内存或大容量硬盘的系统。也不需要专门去安装 Windows、MacOS 或 Linux。用于家庭用途的操作系统足以支撑 Selenium 进行测试。 最重要的是,你可以在任何浏览器上测试网站,无论是 Chrome 还是 Firefox,Safari 或 Internet Explorer,甚至是 Opera。使用 Selenium 如此简单,甚至与将 USB 驱动器插入电脑复制数据一样。 3. 支持多种编程语言 这是程序员进入自动化测试领域的最重要因素。市场上大多数工具都需要你专注于一种特定的编程语言。诸如VBScript、Java、C# 等语言就是各种工具所需的常用脚本语言。 ...

April 21, 2019 · 1 min · jiezi

记一次还可以抢救一下的爬虫私活,求接盘!

前言最近接了一个爬虫的私活,收益颇丰。自认为对爬虫掌握的还算不错,爬过很多国内外网站,数据超过百万,应对过封IP、设验证码、假数据、强制登录等反爬虫手段。于是乎,我毫不犹豫的接下了该活。但是进行了一半,我遇到了困难,写这篇文章希望能够找到感兴趣的朋友一起解决,一起分享劳动成果。如果到期没有解决的话,就当一次经历记录一下也罢。项目需求一个类似百度文库的网站,要求给出url,获得文章,以Word形式保存下来。保持格式不变。我的进展和思路我以前爬数据都是以文本的形式获得数据,然后清洗,保存数据库。但是这次需要保存到word,这不难,难在要求格式不变。我打算根据元素的css属性,设置在word里面的格式。获取文本首先我使用我最熟悉的python+selenium+chrome组合,无头模式启动不用打开浏览器比较方便def open_brower_headless(): chromeOptions = webdriver.ChromeOptions() chromeOptions.add_argument(“headless”) browser = webdriver.Chrome(chrome_options=chromeOptions) return browser文章部分是一个iframe框,通过selenium的switch_to_frame()方法切换到iframe元素,然后就是一系列的定位取值操作,很容易的取到了文章的文本。文章都是以许多<p>标签组合在一起的。通过绝对定位控制格式。(爬虫手法详情https://segmentfault.com/a/11…)我利用selenium的value_of_css_property()方法可以获得元素的属性(font-family、top、font-size),这个方法比较强,不仅可以获得行内样式的css,还可以获得外嵌式的css,所以我不用担心它的样式写在css文件里。这样每一行的格式我就得到了。1. 怎么换行?对比该元素和上一个元素的top属性的值,如果不一样就换行,高度不一样必定不在一行,很合理。2. 文字大小?元素的font-size的大小换算公式 ($/14 +0.5),差不多匹配docx里面的run.font.size的值docx写入wordpython库里面操作word使用的是docx,docx对word 的读写有一套完整的方法。比如:添加文字,设置字体,颜色,大小,段落,表格,添加图片。docx的使用也非常简单,主要分为三级:file >paragraph >run,下面简单介绍一下:file = docx.Document() #新建文件f = file.add_paragraph(“添加段落”) #添加段落run = f.add_run(“追加文字”) #追加文字run.font.color.rgb = RGBColor(0,0,1) #设置字体颜色run.font.size = Pt(36) #设置字体大小run.font.name = “宋体” #设置字体run._element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘宋体’)run.add_break() #换行file.save(“d.docx”) #保存文件至今进度如此我完成了一个简单word的爬取和保存。瓶颈但是我遇到了更复杂的问题,就是表格。F12后发现表格的边框就是一个图片! 至此我不知道怎么进行下去了。开始我以为识别图片后我可以利用doxc 插入表格,根据文字的位置,插入在对应的表格里,但是我发现有的文章还有其他图片。所以我不能遇到图片就将下面的文字按照表格里面的文字处理。其他办法发现这条路似乎走不通后,我试了其他办法,就是pandoc,这是一个文档转化工具,windows下安装后通过输入命令来转化文档。比如将a.html转化为b.docxpandoc -s a.html -o b.docx但是得到得word 格式还没有我上面程序写的好,应该是我不太会用,网上对pandoc评价很高,几乎神器。我尝试将html先转化为pdf,然后再转word.但是失败了,需要安装pdf 引擎,而且需要配中文之类的,总之我没有成功,不知道转化成pdf后再转化word 它能否识别并插入表格。而不是背景图。知情人请告知,感激不尽。我发现文章结构的class名和百度文库里的一样,这是通过百度富文本编辑器编辑的吧?,如果是这样通过这个富文本编辑器反编辑一下是否可行?后面的话距离项目测试版交期还有3天,搞不定这个问题话就黄了,如果有朋友能够解决或者有思路的话可以一起完成,报酬四位数。一起吃鸡,真不舍得放弃!

April 18, 2019 · 1 min · jiezi

chromedriver之此类型文件可能会损害您的计算机提示的处理

背景最近在使用selenium进行自动文件下载时,突然出现了一个报错:下载进行不下去了。思路经过各种谷歌、百度,均告诉我在要增加params,关闭浏览器安全选项,配置如下:chromeOptions = webdriver.ChromeOptions()prefs = {“profile.default_content_settings.popups”: 0, “download.default_directory”: path, “download.prompt_for_download”: False, # “download.directory_upgrade”: ’true’, “safebrowsing.enabled”: True}chromeOptions.add_experimental_option(“prefs”, prefs)事实证明,可能以前的版本是可行的,现在的真心不行。上面配置重点是"safebrowsing.enabled": True。在MacOS的环境下,哪怕不配也是没有问题的,Windows就不行了。最后在谷歌上找到一篇相关文章,大意是说这个是无解的,可能是windows系统安全的问题,对于这个解释我还是比较认可的,所以在mac上就不会提示。Let’s start frankly: you can’t disable this feature. You can merely tweak the download settings in order to avoid it. https://windowsreport.com/typ…那么问题来了,既然这样,有什么曲线救国的办法呢?当chromedriver弹出这个提示的时候,其实文件已经下载完成,如下图:我们只需要将文件名修改为正确的名字和后缀即可(比如test.txt),直接无视警告提醒。思路如下:找到最新下载的文件:通过对下载目录的文件按照创建时间排序,找到最新的判断是否该文件是否已下载完成:通过判断时间间隔前后该文件是否有大小的变化结论根据上面思路,实现的关键代码如下:def sort_file(): global path dir_lists = os.listdir(path) dir_lists.sort(key=lambda fn: os.path.getmtime(os.path.join(path, fn))) return dir_lists[-1] def changeName(path, oldname, newname): old_path = os.path.join(path, oldname) new_path = os.path.join(path, newname + ‘.txt’) if os.path.exists(old_path): if os.path.exists(new_path): os.remove(new_path) os.rename(old_path, new_path) print (‘rename done!’ + newname) else: print (’no file found!’) def download(): … temp_filename = sort_file() if u’未确认’ in temp_filename: temp_filesize_old = os.path.getsize(os.path.join(path, temp_filename)) while True: time.sleep(1) temp_filesize_new = os.path.getsize(os.path.join(path, temp_filename)) if temp_filesize_old == temp_filesize_new: changeName(path, temp_filename, ip) return else: temp_filesize_old = temp_filesize_new else: print(u’下载失败’)需要注意的是,在文件重命名的时候,先检查下文件是否已经存在,先删除,在创建。以上。 如果有更好的思路,欢迎分享。 ...

March 18, 2019 · 1 min · jiezi

selenium跳过webdriver检测并爬取淘宝我已购买的宝贝数据

简介上一个博文已经讲述了如何使用selenium跳过webdriver检测并爬取天猫商品数据,所以在此不再详细讲,有需要思路的可以查看另外一篇博文。源代码 # -- coding: utf-8 --from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqfrom time import sleepimport random#定义一个taobao类class taobao_infos: #对象初始化 def init(self): url = ‘https://login.taobao.com/member/login.jhtml' self.url = url options = webdriver.ChromeOptions() options.add_experimental_option(“prefs”, {“profile.managed_default_content_settings.images”: 2}) # 不加载图片,加快访问速度 options.add_experimental_option(’excludeSwitches’, [’enable-automation’]) # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=options) self.wait = WebDriverWait(self.browser, 10) #超时时长为10s #登录淘宝 def login(self): # 打开网页 self.browser.get(self.url) # 自适应等待,点击密码登录选项 self.browser.implicitly_wait(30) #智能等待,直到网页加载完毕,最长等待时间为30s self.browser.find_element_by_xpath(’//[@class=“forget-pwd J_Quick2Static”]’).click() # 自适应等待,点击微博登录宣传 self.browser.implicitly_wait(30) self.browser.find_element_by_xpath(’//[@class=“weibo-login”]’).click() # 自适应等待,输入微博账号 self.browser.implicitly_wait(30) self.browser.find_element_by_name(‘username’).send_keys(weibo_username) # 自适应等待,输入微博密码 self.browser.implicitly_wait(30) self.browser.find_element_by_name(‘password’).send_keys(weibo_password) # 自适应等待,点击确认登录按钮 self.browser.implicitly_wait(30) self.browser.find_element_by_xpath(’//[@class=“btn_tip”]/a/span’).click() # 直到获取到淘宝会员昵称才能确定是登录成功 taobao_name = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘.site-nav-bd > ul.site-nav-bd-l > li#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-user > a.site-nav-login-info-nick ‘))) # 输出淘宝昵称 print(taobao_name.text) # 模拟向下滑动浏览 def swipe_down(self,second): for i in range(int(second/0.1)): #根据i的值,模拟上下滑动 if(i%2==0): js = “var q=document.documentElement.scrollTop=” + str(300+400i) else: js = “var q=document.documentElement.scrollTop=” + str(200 * i) self.browser.execute_script(js) sleep(0.1) js = “var q=document.documentElement.scrollTop=100000” self.browser.execute_script(js) sleep(0.1) # 爬取淘宝 我已买到的宝贝商品数据 def crawl_good_buy_data(self): # 对我已买到的宝贝商品数据进行爬虫 self.browser.get(“https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm") # 遍历所有页数 for page in range(1,1000): # 等待该页面全部已买到的宝贝商品数据加载完毕 good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘#tp-bought-root > div.js-order-container’))) # 获取本页面源代码 html = self.browser.page_source # pq模块解析网页源代码 doc = pq(html) # # 存储该页已经买到的宝贝数据 good_items = doc(’#tp-bought-root .js-order-container’).items() # 遍历该页的所有宝贝 for item in good_items: good_time_and_id = item.find(’.bought-wrapper-mod__head-info-cell___29cDO’).text().replace(’\n’,”").replace(’\r’,"") good_merchant = item.find(’.seller-mod__container___1w0Cx’).text().replace(’\n’,"").replace(’\r’,"") good_name = item.find(’.sol-mod__no-br___1PwLO’).text().replace(’\n’, “”).replace(’\r’, “”) # 只列出商品购买时间、订单号、商家名称、商品名称 # 其余的请自己实践获取 print(good_time_and_id, good_merchant, good_name) print(’\n\n’) # 大部分人被检测为机器人就是因为进一步模拟人工操作 # 模拟人工向下浏览商品,即进行模拟下滑操作,防止被识别出是机器人 # 随机滑动延时时间 swipe_time = random.randint(1, 3) self.swipe_down(swipe_time) # 等待下一页按钮 出现 good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘.pagination-next’))) # 点击下一页按钮 good_total.click() sleep(2)if name == “main”: # 使用之前请先查看当前目录下的使用说明文件README.MD # 使用之前请先查看当前目录下的使用说明文件README.MD # 使用之前请先查看当前目录下的使用说明文件README.MD chromedriver_path = “/Users/bird/Desktop/chromedriver.exe” #改成你的chromedriver的完整路径地址 weibo_username = “改成你的微博账号” #改成你的微博账号 weibo_password = “改成你的微博密码” #改成你的微博密码 a = taobao_infos() a.login() #登录 a.crawl_good_buy_data() #爬取淘宝 我已买到的宝贝商品数据 使用教程点击这里下载下载chrome浏览器查看chrome浏览器的版本号,点击这里下载对应版本号的chromedriver驱动pip安装下列包[x] pip install selenium点击这里登录微博,并通过微博绑定淘宝账号密码在main中填写chromedriver的绝对路径在main中填写微博账号密码 #改成你的chromedriver的完整路径地址 chromedriver_path = “/Users/bird/Desktop/chromedriver.exe” #改成你的微博账号 weibo_username = “改成你的微博账号” #改成你的微博密码 weibo_password = “改成你的微博密码” 演示图片爬虫过程图片查看不了点击这里爬虫结果图片查看不了点击这里其他爬虫源代码所有关于爬虫的项目都放在github了,有需要的可以去GitHub仓库项目持续更新,欢迎您star本项目 ...

March 14, 2019 · 2 min · jiezi

selenium跳过webdriver检测并模拟登录淘宝

简介模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网站的升级,采取该策略比较难实现了。因为你使用get/post方式进行爬取数据,会提示需要登录,而登录又是一大难题,需要滑动验证码验证。当你想使用IP代理池进行跳过检验时,发现登录时需要手机短信验证码验证,由此可以知道旧的全自动爬取数据对于大型网站比较困难了。selenium是一款优秀的WEB自动化测试工具,所以现在采用selenium进行半自动化爬取数据,支持模拟登录淘宝和自动处理滑动验证码。编写思路由于现在大型网站对selenium工具进行检测,若检测到selenium,则判定为机器人,访问被拒绝。所以第一步是要防止被检测出为机器人,如何防止被检测到呢?当使用selenium进行自动化操作时,在chrome浏览器中的consloe中输入windows.navigator.webdriver会发现结果为Ture,而正常使用浏览器的时候该值为False。所以我们将windows.navigator.webdriver进行屏蔽。在代码中添加: options = webdriver.ChromeOptions() # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium options.add_experimental_option(’excludeSwitches’, [’enable-automation’]) self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=options)同时,为了加快爬取速度,我们将浏览器模式设置为不加载图片,在代码中添加: options = webdriver.ChromeOptions() # 不加载图片,加快访问速度 options.add_experimental_option(“prefs”, {“profile.managed_default_content_settings.images”: 2}) 至此,关键的步骤我们已经懂了,剩下的就是编写代码的事情了。在给定的例子中,需要你对html、css有一定了解。比如存在以下代码: self.browser.find_element_by_xpath(’//[@class=“btn_tip”]/a/span’).click() taobao_name = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘.site-nav-bd > ul.site-nav-bd-l > li#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-user > a.site-nav-login-info-nick ‘))) print(taobao_name.text)第1行代码指的是从根目录(//)开始寻找任意()一个class名为btn_tip的元素,并找到btn_tip的子元素a标签中的子元素span第2行代码指的是等待某个CSS元素出现,否则代码停留在这里一直检测。以.开头的在CSS中表示类名(class),以#开头的在CSS中表示ID名(id)。A > B,指的是A的子元素B。所以这行代码可以理解为寻找A的子元素B的子元素C的子元素D的子元素E出现,否则一直在这里检测。第3行代码指的是打印某个元素的文本内容使用教程点击这里下载下载chrome浏览器查看chrome浏览器的版本号,点击这里下载对应版本号的chromedriver驱动pip安装下列包[x] pip install selenium点击这里登录微博,并通过微博绑定淘宝账号密码在main中填写chromedriver的绝对路径在main中填写微博账号密码 #改成你的chromedriver的完整路径地址 chromedriver_path = “/Users/bird/Desktop/chromedriver.exe” #改成你的微博账号 weibo_username = “改成你的微博账号” #改成你的微博密码 weibo_password = “改成你的微博密码” 演示图片图片查看不了点击这里源代码项目源代码在GitHub仓库项目持续更新,欢迎您star本项目

March 13, 2019 · 1 min · jiezi

selenium跳过webdriver检测并爬取天猫商品数据

简介现在爬取淘宝,天猫商品数据都是需要首先进行登录的。上一节我们已经完成了模拟登录淘宝的步骤,所以在此不详细讲如何模拟登录淘宝。把关键点放在如何爬取天猫商品数据上。过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网站的升级,采取该策略比较难实现了。因为你使用get/post方式进行爬取数据,会提示需要登录,而登录又是一大难题,需要滑动验证码验证。当你想使用IP代理池进行跳过检验时,发现登录时需要手机短信验证码验证,由此可以知道旧的全自动爬取数据对于大型网站比较困难了(小型网站可以使用get/post,没检测或者检测系数较低)。selenium是一款优秀的WEB自动化测试工具,所以现在采用selenium进行半自动化爬取数据。编写思路由于现在大型网站对selenium工具进行检测,若检测到selenium,则判定为机器人,访问被拒绝。所以第一步是要防止被检测出为机器人,如何防止被检测到呢?当使用selenium进行自动化操作时,在chrome浏览器中的consloe中输入windows.navigator.webdriver会发现结果为Ture,而正常使用浏览器的时候该值为False。所以我们将windows.navigator.webdriver进行屏蔽。在代码中添加: options = webdriver.ChromeOptions() # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium options.add_experimental_option(’excludeSwitches’, [’enable-automation’]) self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=options)同时,为了加快爬取速度,我们将浏览器模式设置为不加载图片,在代码中添加: options = webdriver.ChromeOptions() # 不加载图片,加快访问速度 options.add_experimental_option(“prefs”, {“profile.managed_default_content_settings.images”: 2}) 同时,为了模拟人工操作,我们在浏览网页的时候,模拟下滑,插入代码: # 模拟向下滑动浏览 def swipe_down(self,second): for i in range(int(second/0.1)): js = “var q=document.documentElement.scrollTop=” + str(300+200i) self.browser.execute_script(js) sleep(0.1) js = “var q=document.documentElement.scrollTop=100000” self.browser.execute_script(js) sleep(0.2)至此,关键的步骤我们已经懂了,剩下的就是编写代码的事情了。在给定的例子中,需要你对html、css有一定了解。比如存在以下代码: self.browser.find_element_by_xpath(’//[@class=“btn_tip”]/a/span’).click() taobao_name = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘.site-nav-bd > ul.site-nav-bd-l > li#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-user > a.site-nav-login-info-nick ‘))) print(taobao_name.text)第1行代码指的是从根目录(//)开始寻找任意(*)一个class名为btn_tip的元素,并找到btn_tip的子元素a标签中的子元素span第2行代码指的是等待某个CSS元素出现,否则代码停留在这里一直检测。以.开头的在CSS中表示类名(class),以#开头的在CSS中表示ID名(id)。A > B,指的是A的子元素B。所以这行代码可以理解为寻找A的子元素B的子元素C的子元素D的子元素E出现,否则一直在这里检测。第3行代码指的是打印某个元素的文本内容看完上面的代码,我们大概了解了selenium中html、css的基本规则。我们来实践一下,在搜索商品的时候如何检测一共有多少页呢?不妨看看以下代码: # 等待该页面全部商品数据加载完毕 good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘#J_ItemList > div.product > div.product-iWrap’))) # 等待该页面input输入框加载完毕 input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘.ui-page > div.ui-page-wrap > b.ui-page-skip > form > input.ui-page-skipTo’))) # 获取当前页 now_page = input.get_attribute(‘value’) print(“当前页数” + now_page + “,总共页数” + page_total)打开chrome中的控制台,转向console。点击console面板中的十字指针,移动到网页中的“共31页,到第1页”,然后点击。你就可以看到该元素的class名为ui-page-skipTo,由于在css中,class用.表示,所以代码为.ui-page-skipTo。同时由于他的类型是input输入框,变成input.ui-page-skipTo。那么是否可以把代码直接写成.ui-page-skipTo呢?答案是不一定,如果这个元素在网页中是唯一的,没有其他的input的名字也叫ui-page-skipTo的话,就可以。所以,为了保证代码健壮性,我们从他的父元素一直查找,直到我们觉得那个父元素是唯一的,那么这样查找到的元素就是唯一的了。所以最终查找到的结果为.ui-page > div.ui-page-wrap > b.ui-page-skip > form > input.ui-page-skipTo最后,我们获取这个Input的值,代码为input.get_attribute(‘value’)在获取商品数据中,存在以下代码: # 获取本页面源代码 html = self.browser.page_source # pq模块解析网页源代码 doc = pq(html) # 存储天猫商品数据 good_items = doc(’#J_ItemList .product’).items() # 遍历该页的所有商品 for item in good_items: good_title = item.find(’.productTitle’).text().replace(’\n’,"").replace(’\r’,"") good_status = item.find(’.productStatus’).text().replace(" “,”").replace(“笔”,"").replace(’\n’,"").replace(’\r’,"") good_price = item.find(’.productPrice’).text().replace("¥", “”).replace(" “, “”).replace(’\n’, “”).replace(’\r’, “”) good_url = item.find(’.productImg’).attr(‘href’) print(good_title + " " + good_status + " " + good_price + " " + good_url + ‘\n’)首先,我们获取本页面的源代码html = self.browser.page_source,然后用pq模块对源代码进行格式化解析doc = pq(html),通过上面的讲解,我们已经学会了如何分析css元素了。你会发现有一个DIV元素包含着所有商品元素,他的ID(不是class哦)为J_ItemList,所以代码为#J_ItemList,由于我们要获取的是每一个商品,所以代码为#J_ItemList .product,这样就可以获取所有class名为product的元素啦。接着对每个商品元素进行分析,后面的就不必详细说了。replace函数是对文本进行一些基本替换。使用教程点击这里下载下载chrome浏览器查看chrome浏览器的版本号,点击这里下载对应版本号的chromedriver驱动pip安装下列包[x] pip install selenium点击这里登录微博,并通过微博绑定淘宝账号密码在main中填写chromedriver的绝对路径在main中填写微博账号密码 #改成你的chromedriver的完整路径地址 chromedriver_path = “/Users/bird/Desktop/chromedriver.exe” #改成你的微博账号 weibo_username = “改成你的微博账号” #改成你的微博密码 weibo_password = “改成你的微博密码” 演示图片爬虫过程图片查看不了点击这里爬虫结果图片查看不了点击这里源代码项目源代码在GitHub仓库项目持续更新,欢迎您star本项目 ...

March 13, 2019 · 1 min · jiezi

使用selenium实现批量文件下载

背景实现需求:批量下载联想某型号的全部驱动程序。一般在做网络爬虫的时候,都是保存网页信息为主,或者下载单个文件。当涉及到多文件批量下载的时候,由于下载所需时间不定,下载的文件名不定,所以有一定的困难。思路参数配置在涉及下载的时候,需要先对chromedriver进行参数配置,设定默认下载目录:global base_pathprofile = { ‘download.default_directory’: base_path}chrome_options = webdriver.ChromeOptions()chrome_options.add_experimental_option(‘prefs’, profile)driver = webdriver.Chrome(executable_path=’../common/chromedriver’, options=chrome_options)driver.implicitly_wait(10)页面分析联想官网上每个型号的驱动下载页面如上图所示,虽然前面有一个登陆的遮罩,但是实际上并不影响点击。需要注意的是:驱动列表,需要点击才可以显示具体的下载项目表格,否则可以找到对应元素但无法获取正确的信息driver_list.find_element_by_class_name(‘download-center_list_t_icon’).click()每个下载列表的表头建议做跳过处理if sub_list.find_element_by_class_name(‘download-center_usblist_td01’).text == ‘驱动名称’: continue下载处理在页面中,找到“普通下载”的元素,点击即可下载。最终实现结果是我们希望根据网页的列表进行重命名和重新归档到文件夹,但是我们会发现如下几个问题:下载过来的文件名无法控制。依次下载的话,我们无法确认需要下载多久。并行下载的话,无法有效的区分重命名。在网上找了很久,也没找到在下载时直接重命名的方法,所以最终选择依次下载,当每次下载完成后进行重命名和归档,思路如下:对每个驱动目录,先新建一个文件夹,如:主板点击下载后开始下载文件通过os模块,找到下载目录中所有文件,并按创建时间排序,找到最新创建的文件由于未完成的文件后缀为.crdownload(chrome),那么根据后缀来判断是否已完成下载,未完成的话继续等待待下载完成,将文件重命名并剪切到开始建立的归档目录。这里需要注意的是,有些文件名中不能存在/符号,否则会导致重命名失败,需要做一下替换。在后期测试的时候,发现还有几个坑需要注意:在查找最新创建的文件时,需要注意.DS_Store文件的处理。(Mac系统,Windows则需要考虑thumbs.db)需要判断一下最新创建的文件是否为文件夹,可以通过filter函数来处理最新文件的排序查找实现如下:def sort_file(): # 排序文件 dir_link = base_path dir_lists = list(filter(check_file, os.listdir(dir_link))) if len(dir_lists) == 0: return ’’ else: dir_lists.sort(key=lambda fn: os.path.getmtime(dir_link + os.sep + fn)) return os.path.join(base_path, dir_lists[-1])def check_file(filename): # 忽略系统文件 if filename == ‘.DS_Store’ or filename == ’thumbs.db’: return False global base_path # 排除文件夹 return os.path.isfile(os.path.join(base_path, filename))总结最终实现效果如下:完整代码参考:https://github.com/keejo125/w…如果大家有更好的方法,也欢迎分享。

March 10, 2019 · 1 min · jiezi

Python2+Selenium入门05-关于WebElement类

前面一节主要介绍了 WebDriver 类,这一节则主要介绍 WebElement 类。WebElement 提供了一些功能、属性和方法来实现与网页元素的交互,这些元素主要包括文本框、文本域、按钮、单选框、多选框、表格等等。WebElement功能功能/属性描述实例size获取元素的大小element.sizetag_name获取元素的 HTML 标签名称element.tag_nametext获取元素的文本值element.textWebElement方法方法描述参数实例clear( )清除文本框或者文本域的内容 element.clear( )click( )单击元素 element.click( )get_attribute( )获取元素的属性值name:属性的名称element.get_attribute(“maxlength”)is_displayed( )检查元素对于用户是否可见 element.is_displayed( )is_enabled( )检查元素是否可用 element.is_enabled( )is_selected( )检查元素是否被选中,该方法应用于复选框和单选按钮 element.is_selected( )send_keys(*value)模拟输入文本value:待输入的字符串element.send_keys(“foo”)submit( )用于提交表单,如果对一个元素应用此方法,将会提交该元素所属的表单 element.submit( )value_of_css_property(property_name)获取 CSS 属性的值property_name:CSS 属性的名称element.value_of_css_property(“backgroundcolor”)

February 24, 2019 · 1 min · jiezi

Python2+Selenium入门04-关于WebDriver类

WebDriver 和 WebElement 是 Selenium 中两个非常重要的类,使用它们提供的方法可以实现与浏览器和页面元素的各种交互操作。WebDriver 提供了许多用来与浏览器交互的功能和设置,我们可以通过使用 WebDriver 的功能和一些方法来实现与浏览器窗口、警告、框架和弹出窗口的交互,它也提供了自动化操作浏览器导航栏、设置 cookies、截屏等特性,后面将一一介绍。WebDriver 功能功能/属性描述实例current_url获取当前页面的 URL 地址driver.current_urlcurrent_window_handle获取当前窗口的句柄driver.current_window_handlename获取该实例底层的浏览器名称driver.nameorientation获取当前设备的方位driver.orientationpage_source获取当前页面的源代码driver.page_sourcetitle获取当前页面的标题driver.titlewindow_handles获取当前 session 里的所有窗口的句柄driver.window_handlesWebDriver 方法方法描述参数实例back( )后退一步到当前会话的浏览器历史记录中最后一步操作前的页面 driver.back( )close( )关闭当前浏览器窗口 driver.close( )forward( )前进一步到当前会话的浏览器历史记录中前一步操作后的页面 driver.forward( )get(url)访问目标 URL 并加载网页到当前的浏览器会话URL 是目标网页的网站地址driver.get(“https://www.baidu.com/")maximize_window( )最大化当前浏览器窗口 driver.maximize_window( )quit( )退出当前 driver 并且关闭所有的相关窗口 driver.quit( )refresh( )刷新当前页面 driver.refresh( )switch_to_active_element( )返回当前页面唯一焦点所在的元素 driver.switch_to_active_element( )switch_to_alert( )把焦点切换至当前页面弹出的警告 driver.switch_to_alert( )switch_to_default_centent( )切换焦点至默认框架内 driver.switch_to_default_content( )switch_to_frame(frame_reference)通过索引、名称和网页元素将焦点切换到指定的框架,这种方法也适用于IFRAMESframe_reference:要切换的目标窗口的名称、整数类型的索引或者要切换的目标框架的网页元素driver.switch_to-frame(frame_reference)switch_to_window(window_name)切换焦点到指定的窗口window_name:要切换的目标窗口的名称或者句柄driver.switch_to_window(window_name)implicitly_wait(time_to_wait)超时设置等待目标元素被找到,或者目标指令执行完成。该方法在每个session只需要调用一次time_to_wait:等待时间(单位为秒)driver.implicitly_wait(time_to_wait)set_page_load_timeout(time_to_wait)设置一个页面完全加载完成的超时等待时间time_to_wait:等待时间(单位为秒)driver.set_page_load_timeout(time_to_wait)set_script_timeout(time_to_wait)设置脚本执行的超时时间,应该在execute_async_script抛出错误之前time_to_wait:等待时间(单位为秒)driver.set_script_timeout(time_to_wait)

February 24, 2019 · 1 min · jiezi

Python2+Selenium入门03-元素定位

元素定位当我们想让 Selenium 自动地操作浏览器时,就必须告诉 Selenium 如何去定位某个元素或一组元素,每个元素都有着不同的标签名和属性值,Selenium 提供了以下8种定位元素的方式,每种方式对应了2个方法:find_element_by_( ),是用来定位单个元素的,find_elements_by_( ),是用来定位多个元素的。通过 id 定位通过 name 定位通过 class 定位通过 tag 定位通过 link 定位通过 partial link 定位通过 xpath 定位通过 css 选择器定位下面以百度首页为例进行举例说明:(一)通过 id 定位find_element_by_id(id)find_elements_by_id(id)# * coding:utf-8 _from selenium import webdriverdriver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # 定位id为“kw”的元素input_text = driver.find_element_by_id(“kw”)input_text.send_keys(“selenium”)driver.quit()(二)通过通过 name 定位find_element_by_name(name)find_elements_by_name(name)# _ coding:utf-8 _from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # 定位name为“wd”的元素input_text = driver.find_element_by_name(“wd”)input_text.send_keys(“selenium”)driver.quit()(三)通过 class 定位find_element_by_class_name(name)find_elements_by_class_name(name)# _ coding:utf-8 _from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # 定位class名称为“s_ipt”的元素input_text = driver.find_element_by_class_name(“s_ipt”)input_text.send_keys(“selenium”)driver.quit()(四)通过 tag 定位find_element_by_tag_name(name)find_elements_by_tag_name(name)# _ coding:utf-8 _from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # 定位标签为<input>的元素input_text = driver.find_elements_by_tag_name(“input”)print(len(input_text))driver.quit()(五)通过 link 定位find_element_by_link_text(link_text)find_elements_by_link_text(link_text)# _ coding:utf-8 _from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # 定位链接文本完全匹配“我新闻”的元素news = driver.find_element_by_link_text(“新闻”)news.click()driver.quit()(六)通过 partial link 定位find_element_by_partial_link_text(link_text)find_elements_by_partial_link_text(link_text)# _ coding:utf-8 _from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # 定位链接文本部分匹配“新”的元素news = driver.find_element_by_partial_link_text(“新”)news.click()driver.quit()(七)通过 xpath 定位find_element_by_xpath(xpath)find_elements_by_xpath(xpath)# _ coding:utf-8 _from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # xpath定位,相对路径与属性结合定位搜索框news = driver.find_element_by_xpath(”//input[@id=‘kw’]")news.click()driver.quit()(八)通过 css 选择器定位find_element_by_css_selector(css_selector)find_elements_by_css_selector(css_selector)# _ coding:utf-8 _*_from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(“https://www.baidu.com/") # css选择器,id定位密码输入框news = driver.find_element_by_css_selector(’#kw’)news.click()driver.quit()这里只是简单介绍了8种元素定位方式的使用,比较简单易用的是通过id、name、class定位,我个人比较喜欢的是用xpath定位,当然,最灵活也是最强大的定位方式就是css,它也是比较难掌握的一种方式。关于xpath和css定位方式的详细介绍,可以参考 selenium 元素定位。 ...

February 23, 2019 · 1 min · jiezi

Python2+Selenium入门02-第一个Selenium Python脚本

开始创建和运行第一个自动化测试脚本脚本如下所示:# * coding:utf-8 _*_from selenium import webdriverfrom selenium.webdriver.common.keys import Keys# 创建Chrome驱动实例driver = webdriver.Chrome() driver.maximize_window() # 最大化浏览器driver.implicitly_wait(10) # 设置隐式等待时间为10s# 启动浏览器并且导航到指定URLdriver.get(“https://www.baidu.com/") # 定位name属性为“wd"的元素input_text = driver.find_element_by_name(“wd”)# 清空文本输入框,输入文字"selenium”,然后回车input_text.clear()input_text.send_keys(“selenium”)input_text.send_keys(Keys.RETURN)# 关闭浏览器driver.quit()如果上面的脚本运行正常,将会执行下面的操作:先打开一个Chrome浏览器,然后打开百度首页,在搜索框中输入“selenium”文本,然后点击回车出现搜索结果,最后关闭浏览器。selenium webdriver是一个浏览器自动化测试的API集合,它提供了很多与浏览器自动化交互的特性,包括定位元素、操作元素、操作浏览器、模拟键盘和鼠标操作事件等等,这些特性将在后面的章节中一一进行介绍。注意:如果上述脚本无法正常启动浏览器,需要先检查chromedriver与Chrome浏览器的版本是否一致;然后再检查浏览器对应的chromedriver.exe文件是否放在python的安装目录下,如Windows系统的默认安装路径,C:Python27,如果没有请将该exe文件放在此目录下,然后再次运行脚本。

February 23, 2019 · 1 min · jiezi

selenium和appium内部原理总结

selenium和appium内部原理总结为什么会有这篇文章?前段时间学习了selenium的使用,今天开始接触appium看到appium的原理后产生了疑惑:现在的selenium是通过webdriver来操作驱动浏览器的,然而appium有一个server的概念那么为什么没有app driver这个东西呢?selenium早期的selenium早期的selenium主要是指selenium1.0的版本,这个版本主要由Selenium IDE + Selenium Grid + SeleniumRC组成seleniumRC就是后来被webdriver取代的一个代理serverRC == Remote Control 远程控制早期Selenium 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通讯都通过这个代理 Server 来进行,JavasScript可以获取并调用页面的任何元素,Selenium启动一个Server,将操作Web元素的API调用转化为一段段JavaScript,在Selenium内核启动浏览器之后注入这段JS缺点:但是JS注入速度不理想,稳定性大大依赖于Selenium内核对API翻译成的JS质量高低引入代理Remote Control Server是因为“同源策略”的限制,通过这个代理服务器来“欺骗”远程Server,达到使其以为是从同一个地方load代码以正确返回请求数据的效果seleniumRC的原理Selenium RC Server 启动一个浏览器(或是已经使用中),并注入js代码将测试脚本代码传到客户端的 Selenium-Core 中Selenium-Core 翻译并解析执行用户录制的操作让代理 Server 进行通讯Remote Control Server 负责跟远程 Web 应用服务器进行通讯seleniumRC的组成Selenium Server(Launcher、Http Proxy、Selenium Core)Client Libraries(用来控制server)seleniumRC的工作流程测试用例通过Client Libraries的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面中,并发浏览器的代理设置为Selenium Server的Http Proxy。测试用例通过Client Libraries的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作Selenium Core接收到指令后,执行操作浏览器收到新的页面请求信息,于是发送Http请求,请求新的web页面。Selenium Server会接收到所有由它启动的浏览器发动的请求Selenium Server接收到浏览器发送的Http请求后,自己重组Http请求,获取对应的web页面Selenium Server的Http Proxy把接收的Web页面返回给浏览器现在的seleniumselenium3.0以后移除了seleniumRC,取而代之的是webdriver用一张图来展示selenium3.0的运行原理这里讲到的是测试脚本和浏览器的交互,客户端开始运行驱动浏览器的脚本的时候,这时浏览器收到请求开始启动并开启侦听端口,并自动创建session,保持浏览器和对应客户端的会话连接,然后客户端运行脚本,向浏览器发送http请求,浏览器解析请求,根据脚本内容做出相应操作,返回response。这时客户端根据response选择结束还是继续执行tips:webdriver操作浏览器、页面采用的协议:the webdriver wire protocolClient和Server的通信协议:HTTPHTTP传输的数据内容为遵循WP协议json格式数据浏览器驱动实现了webdriver协议的apiappiumappium和selenium之间的不同appium本身就是一个server,而selenium废弃了server,用webdriver来驱动浏览器appium工作原理当开启appium服务器的同时就开启了监听端口;我们运行脚本的时候,调用任何的appiumAPI,都会向Appium Server端post一条HTTP请求,请求内容就是根据webdriver wire protocol协议规定的一条JSON格式的数据;Appium Server端接收到请求后,解析出JSON数据并发送到手机端;手机端上已经由BootStrap.jar(iOS为BootStrip.js)开启的socket服务器监听相应的端口,BootStrap.jar在appium每个session第一次访问手机端的时候会自动安装;手机端接收到对应的请求后,通过BootStrap.jar翻译成UIAutomator能执行的命令,然后通过UIAutomator处理并操作APP完成测试。appium的几个概念appium/appium server一般所说的appium其实是一个基于node.js的web服务器,它是测试脚本和设备端交互的桥梁用npm install -g appium 安装的是命令行的没有界面的appium serverappium GUI它是把没有界面的appium server封装出了一个图形界面,方便操作,但是现在已经被appium desktop所取代appium Desktop它是一款适用于Mac,Windows和Linux的开源应用程序,它以美观而灵活的用户界面为您提供appium server的强大功能appium client第1点中说到,appium其实是一个sweb server,server是接收请求来操作设备端的app的,既然有了server那么一定会有client这个client就是我们写测试脚本时导入的包python中可以运行 pip install Appium-Python-Client 来安装Android 和 iOS ...

January 27, 2019 · 1 min · jiezi

关于webdriver

webdriver协议webdriver协议是一套json格式的规范,本身是基于http协议的这个协议规定了每个操作对应的数据格式,webdriver作为一个服务端,需要实现协议中的每一个操作作为客户端的库文件需要封装好给用户使用的api,每个api对应着协议中不同的数据格式,这些数据封装在http中的body中,数据格式内容和具体的操作一一对应selenium中的webdriver就是浏览器驱动,比如ChromeDriver等,驱动实现了webdriver协议appium中的webdriver是appium server通俗地说:由于客户端脚本(java, python, ruby)不能直接与浏览器/手机通信,这时候可以把webdriver server当做一个翻译器,它可以把客户端代码翻译成浏览器/手机可以识别的代码(比如js),客户端通过http请求向webdriver server发送restful的请求,webdriver server翻译成浏览器/手机懂得脚本传给浏览器/手机,浏览器/手机把执行的结果返回给webdriver server,webdriver server把返回的结果做了一些封装(JSON Wire protocol),然后返回给客户端脚本,客户端根据返回值就能判断对浏览器/手机的操作是否执行成功协议就像是一个抽象类,规定了方法,以及触发方法所需要的数据格式和内容,但是没有具体实现;服务端需要具体去实现这些方法;客户端则需要按照协议规定的数据格式和内容去封装提供给用户的apiselenium中的WebDriver类selenium作为一个客户端,提供给用户的接口基本都在selenium/webdriver/remote/webdriver.py中的WebDriver类中实现这个类是selenium中所有关于浏览器driver类的基类截取Chrome webdriver类中初始化的一段代码:try: RemoteWebDriver.init( self, command_executor=ChromeRemoteConnection( remote_server_addr=self.service.service_url, keep_alive=keep_alive), desired_capabilities=desired_capabilities)except Exception: self.quit() raiseself._is_remote = False可以看到调用了基类的初始化方法,来连接到webdriver server,在此之前会寻找浏览器驱动,并自动启动服务:self.service = Service( executable_path, # 默认为chromedriver port=port, service_args=service_args, log_path=service_log_path)self.service.start() #启动server之后,脚本调用对应的api,就会向这个server发送符合webdriver协议规范的http请求,server接收请求来操作浏览器appium中的WebDriver类appium中的WebDriver继承自很多类,功能更加丰富,当然它也继承了selenium中的webdriver基类class WebDriver( ActionHelpers, Activities, Applications, Clipboard, Context, DeviceTime, HardwareActions, ImagesComparison, IME, Keyboard, Location, Network, RemoteFS, ScreenRecord):在初始化中,command_executor参数填写的是appium server的地址+端口号,这个appium server我们在运行脚本前需要手动启动之后脚本调用对应的api,就会向这个appium server发送符合webdriver协议规范的http请求,appium server接收请求来操作手机总结webdriver中的三个角色测试脚本——作为客户端浏览器驱动/appium server——作为服务端浏览器/手机——作为服务端操作的对象客户端包的作用屏蔽有关协议的内容,让用户不必关心这些细节,只需使用提供给用户的api即可完成相应的操作

January 27, 2019 · 1 min · jiezi

Selenium实现付费音乐批量下载

必备环境废话每年回家都要帮我爸下些音乐,这对我来说都是轻车熟路!可当我打开网易云点击下载按钮的时候,可惜已物是人非啦!开个 VIP 其实也不贵,临时用用也就¥15!但 IT 男的尊严必须要有,于是开始徜徉于搜索引擎中最后在知乎中,搜索到一个网址 VIP付费音乐解析P.S.再次感谢提供该服务的作者!如果你下载的音乐数量不多,直接这里搜索下载,下载后修改文件名即可!并且在这个网址中点击播放列表-点击同步,可以同步网易云的歌单!之后批量下载即是下载这些网易云的歌单!但是下载某个歌单中的几百首歌,手动下载就不现实了!在点击同步中需要输入你的网易云 UID,这 UID 的获取方式如下:第一步打开网易云随便选中一首歌,右键复制链接然后随便找个地方粘贴这个链接,例如https://music.163.com/song?id=25727803&userid=275613591最后这串数字就是 UID!程序运行环境第一步安装一个python3,这个简单吧!贴上我的版本 python3.65,安装时注意勾选Add in path第二步下载FFmpeg,这是用来解析视频和音频的,作为you-get的辅助工具,下载点这里,下载后解压添加环境变量即可第三步安装you-get,这是个下载视频音频的神器,有兴趣可以深入研究!之后我打算写个下载任意视频的工具,嘿嘿这是后话了!安装方式很简单pip install you-get环境配置就这样,还是非常轻松的,下面会解释下代码源码完整代码from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimport time, os# import thredingdef get_music_name_link(): main_handle = browser.current_window_handle fp = open(‘E:\Project_PY\file\musiclink.txt’,‘wb’) fp2 = open(‘E:\Project_PY\file\musicname.txt’,‘wb’) try: for i in list(range(2,400)): browser.switch_to_window(main_handle) txt = browser.find_element_by_xpath(’/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]’ % i).text + ‘\n’ fp2.write(bytes(txt,encoding=‘utf-8’)) location = browser.find_element_by_xpath(’/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]’ % i) ActionChains(browser).move_to_element(location).perform() browser.find_element_by_xpath(’/html/body/div[3]/div/div[2]/div[2]/div[1]/div/div[%d]/span[5]/div/span[2]’ % i).click() time.sleep(2) all_handles = browser.window_handles browser.switch_to_window(all_handles[-1]) # lastest url_link = browser.current_url + ‘\n’ fp.write(bytes(url_link,encoding=‘utf-8’)) browser.close() except Exception as e: print(‘get_music_name_link meet some problem! {}’.format(e)) fp.close() fp2.close()def download_music(list_name): with open(‘E:\Project_PY\file\musicname.txt’,‘r’,encoding=‘utf-8’) as fp1: music_name = fp1.readlines() len1 = len(music_name) fp2 = open(‘E:\Project_PY\file\musicname_format.txt’,‘w’,encoding=‘utf-8’) for i in range(3,len1,4): music_name_format = music_name[i].strip() + ‘\n’ fp2.write(music_name_format) fp2.close() with open(‘E:\Project_PY\file\musiclink.txt’,‘r’,encoding=‘utf-8’) as fp1: with open(‘E:\Project_PY\file\musicname_format.txt’,‘r’,encoding=‘utf-8’) as fp2: for music_link,music_name in zip(fp1.readlines(),fp2.readlines()): you_get_link = ‘you-get “{}” -o “E:\Project_PY\file\music\{}” -O “{}”’.format(music_link.strip(),list_name,music_name.strip()) you_get_link = you_get_link.strip() # print(you_get_link) os.system(you_get_link)url = ‘http://music.zhuolin.wang/'uid = input(‘please input your uid:’)options = webdriver.FirefoxOptions()options.add_argument(’–headless’)browser = webdriver.Firefox(firefox_options=options)browser.implicitly_wait(8)browser.get(url)# browser.maximize_window()browser.set_window_size(1000,100000)browser.find_element_by_xpath(’/html/body/div[3]/div/div[1]/div/span[3]’).click()# scroll = browser.find_element_by_xpath(’//*[@id=“mCSB_1_dragger_vertical”]’)# ActionChains(browser).drag_and_drop_by_offset(scroll,0,100).perform()# time.sleep(2)all_handles = browser.window_handlesbrowser.switch_to_window(all_handles[-1]) # lastesttime.sleep(1)browser.find_element_by_xpath(’/html/body/div[3]/div/div[2]/div[1]/div[1]/div/span/div[2]/span’).click()all_handles = browser.window_handlesbrowser.switch_to_window(all_handles[-1]) # lastesttime.sleep(1)browser.find_element_by_xpath(’/html/body/div[6]/div[2]/input’).send_keys(uid)browser.find_element_by_xpath(’/html/body/div[6]/div[3]/a[1]’).click()# t1 = threading.Thread(target=get_music_name)# t2 = threading.Thread(target=get_music_link)# t3 = threading.Thread(target=download_music)for i in list(range(3,100)): try: print(‘downloading song_list{}! please waiting….’.format(i)) browser.find_element_by_xpath(’/html/body/div[3]/div/div[2]/div[1]/div[1]/div/div[%d]/img’ % i).click() dir_name = browser.find_element_by_xpath(’/html/body/div[3]/div/div[2]/div[1]/div[1]/div/div[%d]/p’ % i).text time.sleep(1) get_music_name_link() download_music(dir_name) browser.find_element_by_xpath(’/html/body/div[3]/div/div[1]/div/span[3]’).click() time.sleep(1) all_handles = browser.window_handles browser.switch_to_window(all_handles[-1]) # lastest time.sleep(5) except Exception as e: print(‘get_song_list meet some problem! {}’.format(e))browser.quit()核心代码解释总共有三个函数:函数一get_music_name_link,主要是获取音乐名称以及音乐的下载链接函数二download_music,获取歌单名称,然后拼接下载链接和音乐名,调用you-get开始下载到对应目录函数三main,主要是利用 UID 获取歌单,以及批量下载歌单中的曲目需要注意的几个点:1.使用了sleep(1)休眠一秒,如果网络较慢需要将所有的sleep休眠时间加长2.所有的路径需要自己根据本机修改3.如果要修改代码一定要注意switch_to_window来切换窗口4.73行的for i in list(range(3,100))是用来选择下载的歌单,歌单从 1 开始计数程序演示输入网易云的 UID!然后静静的等待即可…此过程中会有部分音乐的播放声音,不喜欢可以开静音下当所有的链接解析完成后就会调用you-get下载,此过程会自动创建与歌单名相同的文件夹下载完成后P.S.如果要下载所有歌单,就不需要修改代码,直接输入网易云的 UID 运行即可!如果要下载某个具体的歌单只需要改动73行的这个循环for i in list(range(3,100)),所以说程序还是比较简单的,缺点可能就是没时间写 UI,而且也不太会 pyqt 之类的,只会点 MFC!所以将就用吧,功能还是很齐全的!END ...

January 23, 2019 · 2 min · jiezi

selenium中的window handle

webdriver之window handle实例化一个webdriver后相当于开启一个浏览器进程, 一个实例化的driver可以有多个window窗口,在浏览器中显示为多个标签, 比如点击一个链接 网易,会打开一个新的窗口webdriver类中的所有方法有一个前提条件是:都作用于某一window handlewindow handle是惰性的,不会自动切换,如果打开了一个新的窗口,想在新窗口上获取某一元素,需要先手动切换window handle,driver.switch_to.window(xxx_handle)用driver.window_handles可以获取所有窗口句柄窗口句柄是浏览器拥有的,元素没有窗口句柄window handle示例import time from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains def demo(): driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('[http://baidu.com](http://baidu.com)') print(driver.window_handles) #打开百度后第一次打印窗口句柄 bd_kw = driver.find_element_by_css_selector('#kw') bd_sb = driver.find_element_by_css_selector('#su') ac = ActionChains(driver) ac.send_keys_to_element(bd_kw, 'python').click(bd_sb).perform() py = driver.find_element_by_xpath('//*[@id="2"]/h3/a') py.click() #在百度中搜索python后打开一个新的窗口 print(driver.window_handles) #第二次打印窗口句柄 time.sleep(5) driver.close() #关闭driver的当前句柄,可以用current_handle查看 print(driver.window_handles) #第三次打印窗口句柄 driver.switch_to.window(driver.window_handles[-1]) #切换window handle print(driver.current_window_handle) #打印current_window_handle,不切换会报异常,因为之前的window已经被我们关闭了 time.sleep(5) driver.quit() if __name__ == '__main__': demo() ---------------------- &gt;&gt;&gt;['CDwindow-3711170FE14EB6A64A8D9A51249D8EF6'] #只打开了百度首页,所以只有一个 &gt;&gt;&gt;['CDwindow-3711170FE14EB6A64A8D9A51249D8EF6', 'CDwindow-1FDDE8A60F9569D82F5A477DCBF6B8E1'] #打开了百度首页和某一个搜索出来的页面,新的页面在新的窗口中,所以有两个 &gt;&gt;&gt;['CDwindow-1FDDE8A60F9569D82F5A477DCBF6B8E1'] #没切换handle,关闭了第一个window,所以看到,原列表中的第一个元素被删除了,只有新的窗口handle保留下来了 &gt;&gt;&gt;CDwindow-1FDDE8A60F9569D82F5A477DCBF6B8E1 #切换了handle,并打印出current_window_handle tips:driver的current handle也是惰性的,如果current window handle被关闭,那么current_handle这个值就取不到了,会报异常,需要用手动调用driver.switch_to.window 来显示切换。如果元素定位失败,要检查一下是不是打开了新的窗口,如果是,则需要切换window handle,因为它不会自动切换。 ...

January 16, 2019 · 1 min · jiezi

浏览器自动化操作标准--WebDriver

WebDriver是一个浏览器远程控制协议,是一个既定标准,它本身的内容非常丰富,本文不可能全部介绍,本文仅粗略带大家了解一下WebDriver的部分内容以及一个小的实际应用。想深入了解的请参考W3C文档WebDriver.问题背景开发的同学都知道公司为了便于开发和测试都会有多套环境,比如dev开发环境、qa测试联调环境、pre预发模拟线上环境、online线上环境。经常切环境也是一个比较繁琐的事情,简单来说,作为一个前端开发,频率最高的操作路径是:1.通过SwitchHosts切换host2.选择目录和网关(由于环境不够用,但是又需要部署多套代码。为了解决这个问题,我们利用nginx来在一台机器上配置多个目录,每个目录对应不同的代码,当你访问这个页面的时候,网关会记住你所选择的目录,进而对你的请求进行相应的转发)3.登录网页进行ui调试和接口联调SwitchHosts切换host还算方便,但是选择目录、选择网关、打开网页输入用户名密码然后点登录,这个过程操作频率比较高,有点繁琐。能不能自动化这个过程呢?熟悉自动化测试的同学对这个就非常了解了,端到端测试就是利用自动化测试套件模拟用户访问网页的过程。这里我采用selenium-webdriver这个库,通过node来执行自动化脚本,代码如下。那么selenium-webdriver到底是如何与浏览器进行交互的?如何与不同的浏览器进行交互呢?下面就要引入主角了—— WebDriver, WebDriver是W3C的一个标准,它是一个标准,所以不同的浏览器都会有自己的实现,而selenium-webdriver是通过WebDriver协议与浏览器进行交互的。WebDriver是什么WebDriver是W3C的一个标准,是一个远程控制协议,它提供了跨平台和跨语言的方式来远程操控浏览器,它提供了一系列接口来访问和操作DOM,进而控制浏览器的行为。它使得web开发者能写一些自动化脚本来测试网页。WebDriver的工作过程(主要参考:https://blog.csdn.net/ant_ren…)浏览器在启动后会在某一个端口启动基于WebDriver协议的Web Service,接下来我们调用WebDriver的任何api时,都需要借助一个ComandExecutor发送一个命令(也就是给监听端口上的Web Service发送一个http请求),这个命令会告诉浏览器接下来要做什么。WebDriver的实际应用selenium-webdriver这是一个浏览器自动化库,它提供了许多浏览器自动化接口,用于测试web应用。除了通过npm安装selenium-webdriver之外,还需要安装浏览器相应的驱动。它相应的api和用法selenium-webdriver在我们new一个WebDriver的过程中,selenium首先会确认浏览器的native component是否存在可用而且匹配的版本,然后就在目标浏览器里启动一整套Web Service,这套Web Service使用了selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等。参考资料https://www.cnblogs.com/linbo…https://cloud.tencent.com/dev...http://www.cnblogs.com/sunada…

January 10, 2019 · 1 min · jiezi

Web 端的测试 Selenium 用法必备

大家都知道,基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于 Python 的 Selenium一、简单介绍Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。二、环境安装1.安装 python,这个。。。忽略,建议 python2.7。2.安装基于 python 的 selenium 依赖包,命令:pip install selenium==2.53.6,你懂的。3.安装浏览器驱动包,推荐使用 chrome 浏览器的 chromedriver.exe,对应 chrome 版本一定要对哦,不然运行不起来的,安装在哪?想放哪放哪,不过一般是放在 python 的根目录下。下载地址:chromedriver.storage.googleapis.com/index.html4.安装 PyCharm 2.7 左右版本,这个无脑安装~然后可自定义界面 UI 及编码风格,这个。。。忽略三、牛刀小试1.控制浏览器 #coding=utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get(“http://www.baidu.com”)driver.maximize_window() #将浏览器最大化显示driver.set_window_size(480, 800) #设置浏览器宽480、高800显示" driver.back() #后退driver.forward() #前进 driver.close() #关闭chromedriver.quit() # 退出chrome对Python开发感兴趣可以加705673780,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。2.对象的定位通过 id 定位:find_element_by_id()通过 name 定位:find_element_by_name()通过 class 定位:find_element_by_class_name()通过 tag 定位:find_element_by_tag_name()通过 link 定位:find_element_by_link_text()通过 partial_link 定位:find_element_by_partial_link_text()通过 xpath 定位:find_element_by_xpath()通过 css 定位:find_element_by_css_selector()以上几种定位是常规操作,应该就基本够用了,但是有的时候就是会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,接下来介绍下非常规操作:id 定位:document.getElementById()name 定位:document.getElementsByName()tag 定位:document.getElementsByTagName()class 定位:document.getElementsByClassName()css 定位:document.querySelectorAll() search_js = “document.getElementsByName(‘wd’)[0].value=‘selenium’;”# 通过name定位,然后赋值“selenium” search_js2 = “document.querySelectorAll(’.s_ipt’)[0].value=‘selenium’;”# 通过css定位,然后赋值“selenium” button_js = “document.getElementById(‘su’).click();”# 通过id定位,然后执行单击操作 button_js2 = “document.getElementsByClassName(’s_btn’)[0].click()”# 通过className定位,然后执行单击操作 driver.execute_script(search_js2)#执行,execute_script(script, *args)以上几种定位是可以再度升级,可以利用 jQuery 定位一波,这里可参看之前总结的 JQ 选择器中的思维导图知识点(www.cnblogs.com/aoaoao/arti… JS,便忽略3.操作测试对象 #coding=utf-8from selenium import webdriverdriver = webdriver.Chrome()driver.get(“http://passport.kuaibo.com/login/")driver.find_element_by_id("user_name").clear() #清除输入框的默认内容driver.find_element_by_id(“user_name”).send_keys(“username”)driver.find_element_by_id(“user_pwd”).clear()driver.find_element_by_id(“user_pwd”).send_keys(“password”) #输入输入框的内容为“password”driver.find_element_by_id(“dl_an_submit”).click() #通过 submit() 来提交操作driver.find_element_by_id(“dl_an_submit”).submit()size=driver.find_element_by_id(“kw”).size #返回百度输入框的宽高 text=driver.find_element_by_id(“cp”).text #返回百度页面底部备案信息#返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性attribute=driver.find_element_by_id(“kw”).get_attribute(’type’) #返回元素的结果是否可见,返回结果为 True 或 Falseresult=driver.find_element_by_id(“kw”).is_displayed()driver.quit() #退出4.鼠标键盘事件from selenium import webdriver #引入 Keys 类包from selenium.webdriver.common.keys import Keys #引入 ActionChains 类from selenium.webdriver.common.action_chains import ActionChains… #鼠标事件 #定位到要操作的元素right =driver.find_element_by_xpath(“xx”) #对定位到的元素执行鼠标右键操作ActionChains(driver).context_click(right).perform() #对定位到的元素执行鼠标双击操作ActionChains(driver).double_click(right).perform() #对定位到的元素执行鼠标移动到上面的操作ActionChains(driver).move_to_element(right).perform() #对定位到的元素执行鼠标左键按下的操作ActionChains(driver).click_and_hold(right).perform() #定位元素的原位置element = driver.find_element_by_name(“xxx”) #定位元素要移动到的目标位置target = driver.find_element_by_name(“xxx”) #执行元素的移动操作ActionChains(driver).drag_and_drop(element, target).perform() #键盘事件 #删除多输入的一个 值driver.find_element_by_id(“kw”).send_keys(Keys.BACK_SPACE) #输入空格键+“教程”driver.find_element_by_id(“kw”).send_keys(Keys.SPACE)driver.find_element_by_id(“kw”).send_keys(u"教程”) #ctrl+x 剪切输入框内容driver.find_element_by_id(“kw”).send_keys(Keys.CONTROL,‘x’) #其余的键盘操作类似5.等待时间 #coding=utf-8from selenium import webdriver #导入 WebDriverWait 包from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC #导入 time 包import timedriver = webdriver.Chrome()driver.get(“http://www.baidu.com”) #WebDriverWait()方法使用,显示等待,WebDriverWait(driver,超时时长,调用频率,忽略异常).until(可执行方法,超时返回的信息),这里可以调用EC来实现可执行方法is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“kw”).is_displayed()) #until(method, message=’ ’),调用该方法提供的驱动程序作为一个参数,直到返回值不为 Falseelement.send_keys(“selenium”) #添加智能等待,隐时等待driver.implicitly_wait(30)driver.find_element_by_id(“su”).click() #添加固定休眠时间,强制等待time.sleep(5)driver.quit()6.组对象定位及层级定位,呃,忽略7.多窗口处理 #coding=utf-8from selenium import webdriver import timedriver = webdriver.Chrome()driver.get(“http://www.baidu.com/") #获得当前窗口nowhandle=driver.current_window_handle #打开注册新窗口driver.find_element_by_name(“tj_reg”).click()allhandles=driver.window_handles #循环判断窗口是否为当前窗口for handle in allhandles: if handle != nowhandle: driver.switch_to_window(handle) print ’now register window!’#切换到邮箱注册标签driver.find_element_by_id(“mailRegTab”).click()time.sleep(5)driver.close() #回到原先的窗口driver.switch_to_window(nowhandle)driver.find_element_by_id(“kw”).send_keys(u"注册成功!")time.sleep(3) #ifrome处理 #这里会自动识别id,name,如果没有则可以将元素通过选择器找到,然后输入该元素即可driver.switch_to_frame(“f1”)element = driver.find_element_by_id(“kw”)driver.switch_to_frame(element)driver.quit()&emsp;8.提示窗口处理 #coding=utf-8from selenium import webdriver import timedriver = webdriver.Chrome()driver.get(“http://www.baidu.com/") #点击打开搜索设置driver.find_element_by_name(“tj_setting”).click()driver.find_element_by_id(“SL_1”).click() #点击保存设置driver.find_element_by_xpath(”//div[@id=‘gxszButton’]/input”).click() #获取网页上的警告信息alert=driver.switch_to_alert() #接收警告信息alert.accept() #取消对话框(如果有的话)alert.dismiss() #输入值(如果有的话)alert.send_keys(“xxx”)9.控制浏览器滚动条,这个运用之前提示的jq语句即可实现10.cookie处理,主要用途在于处理验证码问题 #coding=utf-8from selenium import webdriver import timedriver = webdriver.Chrome()driver.get(“http://www.youdao.com”) #向 cookie 的 name 和 value 添加会话信息。driver.add_cookie({’name’:‘key-aaaaaaa’, ‘value’:‘value-bbbb’}) #遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息for cookie in driver.get_cookies(): print “%s -> %s” % (cookie[’name’], cookie[‘value’]) ##### 下面可以通过两种方式删除 cookie ##### # 删除一个特定的 cookiedriver.delete_cookie(“CookieName”) # 删除所有 cookiedriver.delete_all_cookies()time.sleep(2)driver.close()四、小结对Python开发感兴趣可以加705673780,群内会有大佬答疑,学习交流,免费学习资料可以领取。在熟悉了selenium常见的API基本操作后,这里便可以开展实际测试用例的设计了,一个良好的自动化测试用例起码符合一下五个条件:1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统3、尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手 号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱, 很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)4、脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。5、如果对数据进行了修改,需要对数据进行还原。6、在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。最后配合unittest或者testNG单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。 ...

November 20, 2018 · 2 min · jiezi

Python 爬虫利器 Selenium

前面几节,我们学习了用 requests 构造页面请求来爬取静态网页中的信息以及通过 requests 构造 Ajax 请求直接获取返回的 JSON 信息。还记得前几节,我们在构造请求时会给请求加上浏览器 headers,目的就是为了让我们的请求模拟浏览器的行为,防止被网站的反爬虫策略限制。今天要介绍的 Selenium 是一款强大的工具,它可以控制我们的浏览器,这样一来程序的行为就和人类完全一样了。通过使用 Selenium 可以解决几个问题:页面内容是由 JavaScript 动态生成,通过 requests 请求页面无法获取内容。爬虫程序被反爬虫策略限制让程序的行为和人一样安装pip install selenium安装浏览器驱动驱动下载地址下载后把驱动文件加入环境变量。或者直接把驱动文件和 Python脚本放到同一文件夹下面测试 安装完成后,可以编写以下脚本来测试是否安装成功。from selenium import webdriverdriver = webdriver.Chrome() # 创建一个 Chrome WebDriver 实例driver.get(‘https://www.baidu.com/') # 打开网址运行后会发现程序自动打开了 Chrome 浏览器,并且定向到了百度首页。与页面交互 WebDriver定义了很多方法,我们可以很方便的操作页面上的元素 比如获取元素,可以通过 driver.find_element_by_id(“id”)或者driver.find_element_by_name(“name”)以及 xpath路径的方式来获取元素。可以通过send_keys 向输入框中写入文本。from selenium import webdriverdriver = webdriver.Chrome()driver.get(‘https://www.baidu.com/')search_input = driver.find_element_by_id(“kw”) # 获取到百度搜索框search_input.send_keys(“刘亦菲”) # 自动输入 刘亦菲submit = driver.find_element_by_id(“su”) # 获取到百度一下按钮submit.click() # 点击搜索运行以上脚本,程序会自动打开 Chrome 浏览器,并自动搜索 刘亦菲其他操作 Selenium 可以进行各种各样的操作,使程序完全符合人类的操作习惯。下面看一下还有哪些功能。具体可以看官方文档,这里贴一下地址https://selenium-python-zh.readthedocs.io/en/latest/index.html

September 28, 2018 · 1 min · jiezi