def logout_insta(self): # 回到主页 self.driver.get(self.instagram_url) print('{} -- 回到主页'.format(self.now())) # 头像地址 path_avatar = r'//*[@id="react-root"]/section/nav/div[2]/div/div/div[3]/div/div[5]/span/img' try: DW(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.XPATH, path_avatar))) except TimeoutError: print('{} -- 未找到个人中心头像元素,不需要执行退出登录'.format(self.now())) return except TimeoutException: print('{} -- 未找到个人中心头像元素,不需要执行退出登录'.format(self.now())) return except Exception as e: print('{} -- 未知错误,定位个人中心的头像元素时出错 {}'.format(self.now(), e)) return # 点击头像 self.driver.find_elements_by_class_name('_6q-tv')[-1].click() print('{} -- 点击头像'.format(self.now())) # 退出按钮地址 path_logout = r'//div[contains(text(), "退出")]' DW(self.driver, 20, 0.5).until(EC.visibility_of_any_elements_located((By.XPATH, path_logout))) ele_logout = self.driver.find_element_by_xpath(path_logout) print(ele_logout) ele_logout.click() print('{} -- 点击退出按钮'.format(self.now())) # 切换账号按钮 path_switch = r'//button[contains(text(), "切换帐户") or contains(text(), "Switch Account")]' DW(self.driver, 20, 0.5).until(EC.element_to_be_clickable((By.XPATH, path_switch))) self.driver.find_element_by_xpath(path_switch).click()
def is_element_exist(self, path): flag = True try: DW(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.XPATH, path))) return flag except (TimeoutError, TimeoutException): print('{} -- 等待20s未找到该元素,path:{}'.format(self.now(), path)) flag = False return flag except Exception as e: print('{} -- 定位元素时出现未知异常,path:{}; Err:{}'.format(self.now(), path, e)) flag = False return flag
def subscribe_user(self, user, pwd, target_users, frequency, target_num): # 目标用户 # target_users = target_users # 登录用户 # try: # self.login_insta(user, pwd) # except Exception as e: # print('{} -- 登录失败,退出脚本.ERR:{}'.format(self.now(), e)) # content = '{} -- 登录失败,退出脚本.ERR:{}'.format(self.now(), e) # self.send_email(content=content) # return # 本次已经点击关注的个数 num_sub = 0 for target_user in target_users: print('{} -- 目标用户的用户名{}'.format(self.now(), target_user)) try: self.driver except RecursionError: print("{} -- 没有实例化的浏览器".format(self.now())) self.login_insta(user, pwd) # 跳转到目标用户的主页 target_url = '{}{}'.format(self.instagram_url, target_user) self.driver.get(target_url) print('{} -- 跳转到目标用户的主页{}'.format(self.now(), target_url)) # 粉丝列表按钮 path_fans_list = '/html/body/div[1]/section/main/div/header/section/ul/li[2]/a' for i in range(3): try: print('{} -- 等待粉丝列表按钮出现'.format(self.now())) DW(self.driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, path_fans_list))) print('{} -- 粉丝列表按钮出现'.format(self.now())) break except (TimeoutError, TimeoutException): print('{} -- Timeout! 未找到粉丝列表'.format(self.now())) print('{} -- 判断当前页面是否为目标用户主页'.format(self.now())) if self.driver.current_url != target_url: print('{} -- 当前页面的url'.format(self.driver.current_url)) print('{} -- 当前页面不是目标用户的主页'.format(self.now())) print('{} -- 重新跳转到目标用户主页'.format(self.now())) self.driver.get(target_url) if i == 2: print('{} -- 第3次加载目标用户主页,没有找到粉丝列表按钮'.format(self.now())) print('{} -- 结束当前账号 {} 执行'.format(self.now(), user)) # 邮件通知 content = '{} -- 结束当前账号 {} 执行'.format(self.now(), user) self.send_email(content=content) return # 粉丝列表的窗口标题 path_fans_list_title = '/html/body/div[4]/div/div/div[1]/div' try: print('{} -- 点击粉丝列表按钮'.format(self.now())) ele_fans_list = self.driver.find_element_by_xpath(path_fans_list) ele_fans_list.click() except ElementClickInterceptedException: if self.is_element_exist(path_fans_list_title): print('{} -- 粉丝列表已打开'.format(self.now())) else: print('{} -- 当前页面未找到粉丝列表按钮,结束当前账号 {} 执行'.format(self.now(), user)) # 邮件通知 content = '{} -- 当前页面未找到粉丝列表按钮,结束当前账号 {} 执行'.format(self.now(), user) self.send_email(content=content) return except NoSuchElementException: print('{} -- 未知异常导致粉丝列表按钮丢失,结束当前账号 {} 执行'.format(self.now(), user)) # 邮件通知 content = '{} -- 未知异常导致粉丝列表按钮丢失,结束当前账号 {} 执行'.format(self.now(), user) self.send_email(content=content) return # if self.is_element_exist(path_fans_list_title): # print('{} -- 粉丝列表已打开'.format(self.now())) # 关注按钮 path_but_subscribe = "//button[contains(@class, 'sqdOP') and contains(@class, 'L3NKy')]" try: DW(self.driver, 5, 0.5).until(EC.presence_of_element_located((By.XPATH, path_but_subscribe))) except (TimeoutError, TimeoutException): print('{} -- 粉丝列表中没有【关注】按钮'.format(self.now())) print('{} -- 切换到另一个目标用户查找粉丝'.format(self.now())) continue num_s = 0 num_e = 0 while True: # 下拉加载粉丝列表 for i in range(3): try: # div的滚动条操作 js = "document.getElementsByClassName('isgrP')[0].scrollTop=10000000" self.driver.execute_script(js) print('{} -- 加载粉丝列表下一页数据。。。'.format(self.now())) except Exception as e: print('{} -- 加载下一页数据异常,退出当前账号 {} 的执行!{}'.format(self.now(), user, e)) # 邮件通知 content = '{} -- 加载下一页数据异常,退出当前账号 {} 的执行!{}'.format(self.now(), user, e) self.send_email(content=content) return # loading图标 path_loading = r'/html/body/div[5]/div/div/div[2]/ul/div/li[64]/div/svg' for j in range(3): try: DW(self.driver, 10, 0.5).until_not( EC.visibility_of_element_located((By.XPATH, path_loading))) print('{} -- 等待加载完成、loading消失'.format(self.now())) break except (TimeoutError, TimeoutException): print('{} -- 等待了10s仍在加载中,再等10s'.format(self.now())) if j == 2: print('{} -- 等待了30s仍在加载中'.format(self.now())) print('{} -- 粉丝列表加载异常,退出当前账号 {} 的执行'.format(self.now(), user)) # 邮件通知 content = '{} -- 粉丝列表加载异常,退出当前账号 {} 的执行'.format(self.now(), user) self.send_email(content=content) return # 所有的关注按钮 eles_but_subscribe = self.driver.find_elements_by_xpath(path_but_subscribe) num_e = len(eles_but_subscribe) print('{} -- 当前粉丝列表中粉丝数量:{}'.format(self.now(), num_e)) if num_e != num_s: print('{} -- 加载完成'.format(self.now())) break if i == 2: print('{} -- 第3次尝试,加载后粉丝数没有增加'.format(self.now())) break print('{} -- 加载后粉丝数与加载前粉丝数目相同,再尝试加载一次'.format(self.now())) sleep(1) eles_but_subscribe = self.driver.find_elements_by_xpath(path_but_subscribe) for ele_like_but in eles_but_subscribe: if ele_like_but.text == '关注' or ele_like_but.text == 'Follow': num_sub += 1 if not ele_like_but.is_displayed(): # ele_like_but.location_once_scrolled_into_view print('{} -- 把第 {} 个【关注】按钮移动到可见位置'.format(self.now(), num_sub)) self.driver.execute_script("arguments[0].scrollIntoView();", ele_like_but) try: ele_like_but.click() except Exception as e: path_err = "/html/body/div[6]/div/div/div/div[1]/h3" if self.is_element_exist(path_err): print('{} -- 关注第 {} 个用户时,账号 {} 被限制,退出当前账号执行! {}'.format(self.now(), num_sub, user, e)) # 邮件通知 content = '{} -- 关注第 {} 个用户时,账号 {} 被限制,退出当前账号执行! {}'.format(self.now(), num_sub, user, e) self.send_email(content=content) return print('{} -- 未知异常造成点击【关注】按钮失败! {}'.format(self.now(), e)) print('{} -- 已关注 {} 个用户'.format(self.now(), num_sub)) sleep_time = random.randint(0, frequency) print('{} -- 随机休息 0-{}s,随机结果:{}s'.format(self.now(), frequency, sleep_time)) sleep(sleep_time) # 当关注的人数达到配置的人数,停止脚本 if num_sub == int(target_num): print('{} -- {} 已关注 {} 个用户,账号 {} 停止执行'.format(self.now(), user, num_sub, user)) content = '{} -- {} 已关注 {} 个用户,账号 {} 停止执行'.format(self.now(), user, num_sub, user) subject = '脚本执行完成通知' self.send_email(subject=subject, content=content) # self.close_browser() return if num_e == num_s: print('{} -- 没有更多的粉丝,共加载 {} 个粉丝'.format(self.now(), num_e)) print('{} -- 切换到另一个目标用户'.format(self.now())) break num_s = num_e
def login_insta(self, username, password): # self.instagram_url = 'https://www.instagram.com/' # self.open_browser(self.instagram_url) print('{} -- 准备登录的用户:{}'.format(self.now(), username)) # try: # if self.driver.current_url != self.instagram_url: # print('{} -- 当前页面url:{}'.format(self.now(), self.driver.current_url)) # if 'Instagram' in self.driver.title: # print('{} -- 当前已经登录Instagram'.format(self.now())) # return # print('{} -- 当前不在Instagram登录页面,当前页面url:{}'.format(self.now(), self.driver.title)) # self.driver.get(self.instagram_url) # print('{} -- 跳转到Instagram登录页面'.format(self.now())) # except RecursionError: # print('{} -- 当前没有浏览器实例'.format(self.now())) # print('{} -- 重新创建浏览器实例,并访问Instagram网站'.format(self.now())) # self.open_browser(self.instagram_url) path_mail = '//*[@id="loginForm"]/div/div[1]/div/label/input' path_pwd = '//*[@id="loginForm"]/div/div[2]/div/label/input' path_login_but = '//*[@id="loginForm"]/div/div[3]/button' try: DW(self.driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, path_mail))) ele_username = self.driver.find_element_by_xpath(path_mail) print('{} -- 已定位到用户名输入框'.format(self.now())) DW(self.driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, path_pwd))) ele_pwd = self.driver.find_element_by_xpath(path_pwd) print('{} -- 已定位到密码输入框'.format(self.now())) DW(self.driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, path_login_but))) ele_login_but = self.driver.find_element_by_xpath(path_login_but) print('{} -- 已定位到登录按钮'.format(self.now())) except NoSuchElementException as e: print('{} -- 登录页面元素定位失败。{}'.format(self.now(), e)) return except TimeoutException: print('{} -- 登录页面长时间未能定位到输入框或【登录】按钮'.format(self.now())) # self.close_browser() return # 登录 ele_username.clear() ele_username.send_keys(username) print('{} -- 输入用户名'.format(self.now())) ele_pwd.clear() ele_pwd.send_keys(password) print('{} -- 输入密码'.format(self.now())) ele_login_but.click() print('{} -- 点击登录按钮'.format(self.now())) # 登录之后会出现询问是否保存登录信息的页面 path_save_login = '******' # 处理询问是否保存登录信息的页面 if self.is_element_exist(path_save_login): DW(self.driver, 20, 0.5).until(EC.element_to_be_clickable((By.XPATH, path_save_login))) ele_save_login = self.driver.find_element_by_xpath(path_save_login) # 保存登录信息 ele_save_login.click() print('{} -- 是否保存登录信息:是'.format(self.now())) path_personal = '//*[@id="react-root"]/section/nav/div[2]/div/div/div[3]/div/div[5]/span/img' if self.is_element_exist(path_personal): print('{} -- {} 已经登录成功'.format(self.now(), username)) else: print('{} -- 未进入首页!未找到主页头像元素:{}'.format(self.now(), path_personal)) return # 登录之后询问是否开启消息通知,此处选择“下次再说” path_handle_notice = '/html/body/div[4]/div/div/div/div[3]/button[2]' # path_handle_notice = '//button[@class="aOOlW HoLwm "]' path_notice_window = "//div[@class='piCib']" if self.is_element_exist(path_notice_window): DW(self.driver, 20, 0.5).until(EC.element_to_be_clickable((By.XPATH, path_handle_notice))) ele_handle_notice = self.driver.find_element_by_xpath(path_handle_notice) # 点击下次再选 ele_handle_notice.click() print('{} -- 通知设置:下次再选'.format(self.now()))
def like_and_comment_label_post(url, user, pwd, comments): # 登录 try: driver = open_browser(url) except Exception as e: print('{} -- {} -- 启动浏览器失败,退出脚本.ERR: {}'.format( now(), threading.currentThread().name, e)) content = '{} -- {} -- 启动浏览器失败,退出脚本.ERR:{}'.format( now(), threading.currentThread().name, e) send_email(content=content) return try: login_insta(driver, user, pwd) except Exception as e: print('{} -- {} -- 登录失败,退出脚本.ERR:{}'.format( now(), threading.currentThread().name, e)) content = '{} -- {} -- 登录失败,退出脚本.ERR:{}'.format( now(), threading.currentThread().name, e) send_email(content=content) return # # 搜索按钮 # path_search_but = r'//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/div/div' # ele_search_but = driver.find_element_by_xpath(path_search_but) # ele_search_but.click() # print('{} -- {} -- 点击搜索按钮,激活搜索框'.format(now(), threading.currentThread().name)) # # 搜索输入框 # path_search_box = r'//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/input' # ele_search_box = driver.find_element_by_xpath(path_search_box) # ele_search_box.clear() # ele_search_box.send_keys(label) # print('{} -- {} -- 输入话题标签'.format(now(), threading.currentThread().name)) # # # 等待话题列表出现 # path_label_first = r'//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/div[3]/div/div[2]/div/div[1]/a/div' # DW(driver, 20).until(EC.element_to_be_clickable((By.XPATH, path_label_first))) # # # 点击第一个关联的出来的第一个标签 # ele_label_first = driver.find_element_by_xpath(path_label_first) # ele_label_first.click() # # 模拟enter按键 # action = ActionChains(driver) # action.key_down(Keys.ENTER).perform() # action.key_up(Keys.ENTER).perform() while True: for comment in comments: label = comment['label'] comment_link = comment['comment'] # 跳转到话题标签页面 label_page = 'https://www.instagram.com/explore/tags/{}/'.format( label) driver.get(label_page) print('{} -- {} -- 跳转到话题标签 {} 的页面'.format( now(), threading.currentThread().name, label)) # 打开当前页面上第一条帖子 DW(driver, 20).until( EC.visibility_of_any_elements_located( (By.CLASS_NAME, '_9AhH0'))) ele_posts = driver.find_elements_by_class_name('_9AhH0') n = 0 for ele_post in ele_posts: n += 1 # ele_post_first = ele_posts[0] # ele_post_first.click() # print('{} -- {} -- 打开最新一条帖子'.format(now(), threading.currentThread().name)) print('{} -- {} -- 打开当前页第 {} 个帖子'.format( now(), threading.currentThread().name, n)) ele_post.click() # 点赞按钮 path_but_like = r'//div[@class="QBdPU "]/span/*[name()="svg"]' # DW(driver, 20).until(EC.presence_of_element_located((By.XPATH, path_but_like))) ele_but_like = driver.find_element_by_xpath(path_but_like) # 评论框 path_comment_box = r'//form[@class="X7cDz"]/textarea' path_submit_comment = r'//form[@class="X7cDz"]/button[@type="submit"]' sleep(1) is_liked = ele_but_like.get_attribute('aria-label') # print('aria-label:'+ele_but_like.get_attribute('aria-label')) if is_liked in ['赞', 'Like']: ele_but_like.click() sleep(1) print('{} -- {} -- 给新帖子点赞'.format( now(), threading.currentThread().name)) try: ele_comment_box = driver.find_element_by_xpath( path_comment_box) # ele_comment_box = driver.find_element_by_class_name('Ypffh') ele_comment_box.click() # ele_new_comment_box = driver.find_element_by_class_name('Ypffh focus-visible') ele_new_comment_box = driver.find_element_by_xpath( path_comment_box) ele_new_comment_box.clear() comment = 'It is great! There are also something amazing here: @{}'.format( comment_link) ele_new_comment_box.send_keys(comment) print('{} -- {} -- 给新帖子评论 {}'.format( now(), threading.currentThread().name, comment)) ele_submit_comment = driver.find_element_by_xpath( path_submit_comment) ele_submit_comment.click() except NoSuchElementException: print('{} -- {} -- 该帖子未开放评论'.format( now(), threading.currentThread().name)) # 关闭帖子 path_but_close_post = r'//*[name()="svg"][contains(@aria-label,"关闭") or contains(@aria-label,"Close")]' ele_but_close_post = driver.find_element_by_xpath( path_but_close_post) ele_but_close_post.click() print('{} -- {} -- 关闭帖子'.format( now(), threading.currentThread().name)) sleep(2)
def unsubscribe(uname, pwd): # 取消关注的方法 instagram_url = 'https://instagram.com' url = 'https://instagram.com/{}'.format(uname) driver = open_browser(instagram_url) login_insta(driver, uname, pwd) driver.get(url) # 关注人数元素 DW(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'g47SY '))) ele_following_number = driver.find_elements_by_class_name('g47SY ')[2] if ele_following_number.text == 'NaN': print('{} -- {} -- 当前账号 {} 的following列表没有正在关注的人,退出脚本'.format( now(), threading.currentThread().name, uname)) content = '{} -- {} -- 当前账号 {} 的following列表没有正在关注的人,退出脚本'.format( now(), threading.currentThread().name, uname) send_email(content=content) close_browser(driver) return print('{} -- {} -- 当前账号 {} following列表中有 {} 个人'.format( now(), threading.currentThread().name, uname, ele_following_number.text)) ele_following_number.click() DW(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'm82CD'))) print('{} -- {} -- 已经打开following列表'.format(now(), threading.currentThread().name)) while True: try: # div的滚动条操作 div_scroll_top(driver, 100) print('{} -- {} -- 加载列表下一页数据。。。'.format( now(), threading.currentThread().name)) except Exception as e: print('{} -- {} -- 操作列表滚动条异常,退出当前账号 {} 的执行!{}'.format( now(), threading.currentThread().name, user, e)) # 邮件通知 content = '{} -- {} -- 操作列表滚动条异常,退出当前账号 {} 的执行!{}'.format( now(), threading.currentThread().name, user, e) send_email(content=content) close_browser(driver) return try: DW(driver, 20).until_not( EC.presence_of_element_located((By.CLASS_NAME, ' By4nA'))) except (TimeoutException, TimeoutError) as e: print('{} -- {} -- 加载列表下一页超时!等待20s,加载的loading还未消失。退出脚本'.format( now(), threading.currentThread().name)) # 邮件通知 content = '{} -- {} -- 操作列表滚动条异常,退出当前账号 {} 的执行!{}'.format( now(), threading.currentThread().name, user, e) send_email(content=content) close_browser(driver) return # path_but_following = '//button[text()="已关注" or text()="Following"]' path_but_following = '//button[text()="已关注" or text()="Following"]' DW(driver, 20).until( EC.presence_of_element_located((By.XPATH, path_but_following))) ele_but_following = driver.find_elements_by_xpath(path_but_following) number_but_following = len(ele_but_following) # print('Following按钮数量: %s' % len(ele_but_following)) if number_but_following == 0: print('{} -- {} -- 当前账号 {} following列表中没有正在关注的人,退出脚本'.format( now(), threading.currentThread().name, uname)) content = '{} -- {} -- 当前账号 {} 的following列表中没有正在关注的人,退出脚本'.format( now(), threading.currentThread().name, uname) send_email(content=content) close_browser(driver) return for i in range(number_but_following): # path_but_following = '//button[text()="已关注" or text()="Following"]' DW(driver, 20).until( EC.presence_of_element_located((By.XPATH, path_but_following))) ele_but_following = driver.find_elements_by_xpath( path_but_following) but_following = ele_but_following[0] if not but_following.is_displayed(): ele_scroll_to_view(driver, but_following) but_following.click() print('{} -- {} -- 点击【已关注】按钮'.format( now(), threading.currentThread().name)) # DW(driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, 'aOOlW -Cab_ '))) path_confirm_unsubscribe = '//button[text()="停止关注" or text()="Unfollow"]' # ele_confirm_unsubscribe = driver.find_element_by_class_name('aOOlW -Cab_ ') DW(driver, 20).until( EC.element_to_be_clickable( (By.XPATH, path_confirm_unsubscribe))) ele_confirm_unsubscribe = driver.find_element_by_xpath( path_confirm_unsubscribe) ele_confirm_unsubscribe.click() print('{} -- {} -- 点击【停止关注】按钮'.format( now(), threading.currentThread().name)) sleep_time = random.randint(3, 10) sleep(sleep_time) print('{} -- {} -- 随机休息 {} s'.format( now(), threading.currentThread().name, sleep_time))
def login_insta(driver, username, password): print('{} -- {} -- 准备登录的用户:{}'.format(now(), threading.currentThread().name, username)) try: driver.title except RecursionError: print('{} -- {} -- 浏览器实例未运行'.format(now(), threading.currentThread().name)) raise except Exception as e: print('{} -- {} -- 未知异常,浏览器实例不能调用。ERR:{}'.format(now(), threading, e)) raise path_mail = '//*[@id="loginForm"]/div/div[1]/div/label/input' path_pwd = '//*[@id="loginForm"]/div/div[2]/div/label/input' path_login_but = '//*[@id="loginForm"]/div/div[3]/button' try: DW(driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, path_mail))) ele_username = driver.find_element_by_xpath(path_mail) print('{} -- {} -- 已定位到用户名输入框'.format(now(), threading.currentThread().name)) DW(driver, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, path_pwd))) ele_pwd = driver.find_element_by_xpath(path_pwd) print('{} -- {} -- 已定位到密码输入框'.format(now(), threading.currentThread().name)) DW(driver, 20, 0.5).until( EC.presence_of_element_located((By.XPATH, path_login_but))) ele_login_but = driver.find_element_by_xpath(path_login_but) print('{} -- {} -- 已定位到登录按钮'.format(now(), threading.currentThread().name)) except NoSuchElementException as e: print('{} -- {} -- 登录页面元素定位失败。{}'.format( now(), threading.currentThread().name, e)) close_browser(driver) raise except TimeoutException: print('{} -- {} -- 登录页面长时间未能定位到输入框或【登录】按钮'.format( now(), threading.currentThread().name)) close_browser(driver) raise # 登录 ele_username.clear() ele_username.send_keys(username) print('{} -- {} -- 输入用户名'.format(now(), threading.currentThread().name)) ele_pwd.clear() ele_pwd.send_keys(password) print('{} -- {} -- 输入密码'.format(now(), threading.currentThread().name)) ele_login_but.click() print('{} -- {} -- 点击登录按钮'.format(now(), threading.currentThread().name)) # 登录之后会出现询问是否保存登录信息的页面 path_save_login = '******' # 处理询问是否保存登录信息的页面 if is_element_exist(driver, path_save_login): DW(driver, 20, 0.5).until(EC.element_to_be_clickable((By.XPATH, path_save_login))) ele_save_login = driver.find_element_by_xpath(path_save_login) # 保存登录信息 ele_save_login.click() print('{} -- {} -- 是否保存登录信息:是'.format(now(), threading.currentThread().name)) path_personal = '//*[@id="react-root"]/section/nav/div[2]/div/div/div[3]/div/div[5]/span/img' if is_element_exist(driver, path_personal): print('{} -- {} -- {} 已经登录成功'.format(now(), threading.currentThread().name, username)) else: print('{} -- {} -- 未进入首页!未找到主页头像元素:{}'.format( now(), threading.currentThread().name, path_personal)) return # 登录之后询问是否开启消息通知,此处选择“下次再说” path_handle_notice = '/html/body/div[4]/div/div/div/div[3]/button[2]' # path_handle_notice = '//button[@class="aOOlW HoLwm "]' path_notice_window = "//div[@class='piCib']" if is_element_exist(driver, path_notice_window): DW(driver, 20, 0.5).until( EC.element_to_be_clickable((By.XPATH, path_handle_notice))) ele_handle_notice = driver.find_element_by_xpath(path_handle_notice) # 点击下次再选 ele_handle_notice.click() print('{} -- {} -- 通知设置:下次再选'.format(now(), threading.currentThread().name))