1、报错:Can not connect to the Service chromedriver
项目之前运行一直没有问题,今天运行突然报错,本来以为是chrome不小心更新了导致chromedriver匹配不上,但是最后发现是 localhost配置错了
localhost如下配置即可
2、find_element方法底层,id/name/tag_name/class_name都是基于 CSS 定位的
如果通过find_element找到了多个元素,也会默认找第一个
国内CSS:https://www.w3school.com.cn//cssref/css_selectors.asp
3、隐式等待、显式等待
隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,如果在规定的时间没有等到 ,就报错。
def setup_method(self): self.driver = webdriver.Chrome() self.driver.get("https://testerhome.com/") # todo:隐式等待5s,超过则报错 self.driver.implicitly_wait(5)
# todo:显式等待 # sleep(2) element = (By.PARTIAL_LINK_TEXT, '霍格沃兹测试学院') WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable(element)) self.driver.find_element(*element).click()
4、【跳过登录流程,进行UI自动化】
本地指定ip 端口打开浏览器(前提:一定要关闭当前浏览器)
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
正常的话,执行完命令会显示
如果没有红框,可以执行命令 netstat -p tcp -an | grep 9222,查看是否有9222的进程,没有的话,再次关闭所有浏览器,然后重新执行第一条命令
这样在selenium中代码,可以直接在当前打开的浏览器中 继续打开页面进行UI自动化,这种方法可以跳过某些需要登录才能操作的网站
我们可以在这个9222打开的浏览器,提前登录成功,然后进行UI自动化,这样可以避免登录
options = webdriver.ChromeOptions() options.debugger_address = "127.0.0.1:9222" self.driver = webdriver.Chrome(options=options) self.driver.get("https://testerhome.com/")
5、元素定位,优先使用name
原因:name是要传给服务端的,前端不会随意更改的,如果改了,服务端也要改,使用name 定位更好的判断代码是否有问题
而id 只要确保不唯一就可以
6、chromedriver 下载解压后 ,放到 usr/local/bin下【MAC】