一直想尝试用 Python+Selenium+ddddocr 来实现登录,但是每次到验证码这关就难住了,在网上大部分识别验证码的Python文章都是大段篇幅,让我这个小菜鸟无法下手。今天终于通过30行的代码实现了:通过UI自动化,可以输入账号,密码,可以识别简单的验证码 ,点击登录按钮,成功登录页面 。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ddddocr
from selenium import webdriver
from selenium.webdriver.common.by import By
import ddddocr
# 不自动关闭浏览器
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
# 注意此处添加了chrome_options参数
# 访问登录页面
driver = webdriver.Chrome(chrome_options=option)
driver.get('http://登录页面URL')
# 获取验证码,存储为本地图片
img = driver.find_element(By.XPATH,'/html/body/div[1]/div/div/div[2]/div/div/div/form/div[1]/div[3]/div[1]/div[4]/div[2]/img')
# 将获取的图片命名为7.png
img.screenshot('7.png')
# 通过ddddocr包识别验证码
ocr = ddddocr.DdddOcr(old=True)
with open("7.png", 'rb') as f:
image = f.read()
# 将识别后的验证码4位数存储进res变量
res = ocr.classification(image)
# 定位用户名,密码输入框,验证码
username = driver.find_element(By.ID, 'username')
password = driver.find_element(By.ID, 'password')
inputcode = driver.find_element(By.ID, 'inputCode')
# 将自己的用户名密码替换xxxxxx
username.send_keys('Seven')
password.send_keys('Seven1234.')
inputcode.send_keys(res)
# 定位登录按钮并点击
driver.find_element(By.XPATH, '/html/body/div[1]/div/div/div[2]/div/div/div/form/div[2]/div/div/span/button').click()
通过浏览器驱动获取 单个元素页面元素的8种方式
(1) 通过webdriver对象的find_element方法
通过 id获取元素
el = driver.find_element(By.ID, ‘id’)
通过 name获取元素
el = driver.find_element(By.NAME, ‘name’)
通过 className获取元素
el = driver.find_element_by_class_name(className)
通过 tagName获取元素
el = driver.find_element(By.TAG_NAME, ‘tagName’)
通过 xpath获取元素
el = driver.find_element(By.XPATH, ‘xpath’)
通过 css获取元素
el = driver.find_element(By.CSS_SELECTOR, ‘css’)
通过 link_text 获取元素
el = driver.find_element(By.LINK_TEXT, ‘linkText’)
通过 partial_link_text获取元素
el = driver.find_element(By.PARTIAL_LINK_TEXT, ‘linkPartText’)
(2) 通过webdriver对象的find_element_by_xx(" ")
*在selenium的4.0版本中此种用法已经抛弃,不推荐使用
通过 id获取元素
el = driver.find_element_by_id(id)
通过 name获取元素
el = driver.find_element_by_name(name)
通过 className获取元素
el = driver.find_element_by_class_name(className)
通过 tagName获取元素
el = driver.find_element_by_tag_name(tagName)
通过 xpath获取元素
el = driver.find_element_by_xpath(xpath)
通过 css获取元素
el = driver.find_element_by_css_selector(css)
通过 link_text 获取元素
el = driver.find_element_by_link_text(linkText)
通过 partial_link_text获取元素
el = driver.find_element_by_partial_link_text(linkPartText)
ID:id是指页面元素的属性名id值,因为元素id在整个页面中是唯一的,所以如果元素有id属性,通过id定位是首选的方式。如果 id 不唯一则不建议使用。
NAME:通过元素的name属性进行定位。
CLASS NAME:通过元素的class name属性进行定位。
TAG NAME:通过元素名定位,基本不用,因为相同的tagname太多。
LINK_TEXT:通过链接文本内容全匹配。
PARTIAL LINK:通过链接文本内容模糊匹配。
CSS:css_selector定位。
XPATH:通过xpath表达式定位,鼠标右键元素 → 点击检查 → 查看开发者工具中的元素
→ 鼠标悬浮在对应代码上,页面上对应的元素被选中 → 通过以下方式复制完整 xpath(懒人福音,不用手写,也不怕写错)

ddddocr 包开发者个人博客:wenanzhe.com
里面有他的两篇博文,感兴趣的可以过去看看~
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的