📜  使用Python在Selenium中进行非阻塞等待

📅  最后修改于: 2020-05-19 10:51:02             🧑  作者: Mango

先决条件:使用Selenium实现浏览器自动化
当我们想进行网络自动化时,我们需要等待一些Javascript元素加载后才能执行某些操作。为此,通常人们使用

time.sleep(in_seconds)

通过阻塞调用, 无论发生什么情况,它都会等待或使程序休眠上述秒数。这不是一个好主意,因为它通过有效降低程序速度来增加延迟。
对此的可能解决方案是等待元素出现,然后再等待。

先决条件:已安装Python,并已将Selenium与Web驱动程序(.exe文件)一起作为软件包安装。
对于带有Selenium的Python Web Automation,可以通过以下方式实现:
假设您要通过Web自动化登录geeksforgeeks并在用户名和密码元素在网页上可见后立即填写登录凭据,而不要等到整个页面加载完毕。
步骤1:
您可以如下配置网络驱动程序:

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
options.add_argument("disable-infobars")
chrome = webdriver.Chrome(the_path_of_webdriver_which_is_an_exe,
                          chrome_options = options, service_args =['--ignore-ssl-errors = true'])
login_uri = 'https://auth.geeksforgeeks.org/'
username = 'something'
password = 'anything'
username_xpath = '//*[@id ="luser"]'
password_xpath = '//*[@id ="password"]'
sign_in_xpath = '//*[@id ="Login"]/button'
chrome.get(login_uri)

在这里,我使用了chrome网络驱动程序,该驱动程序将在没有信息栏的情况下开始最大化(全窗口)。请注意,为了找到这些元素的xpath,您需要进入开发人员模式并检查这些元素。

第2步:

# 如果元素在30秒内可见,则返回True,否则返回False
def is_visible(locator, timeout = 30):
    try:
        ui.WebDriverWait(chrome, timeout).until(EC.visibility_of_element_located((By.XPATH, locator)))
        return True
    except TimeoutException:
        return False

上面的函数is_visible是我们打算在此处讨论的非阻塞调用的促成因素。
说明:
1)定位器–元素的xpath
2)超时–直到何时等待元素出现(因为我们不想永远等待)
3)chrome –我们之前初始化的webdriver对象
4)它利用了ui的内置实用性,以使Web驱动程序等到元素可见(由xpath标识)
5)如果它确实在超时内出现,则返回True否则False

第三步:
这就是我们利用函数的方式:

if not is_visible(username_xpath): raise RuntimeError("Something went wrong with the username field :(")
username_field = chrome.find_element_by_xpath(username_xpath)
username_field.send_keys(username)
if not is_visible(password_xpath): raise RuntimeError("Something went wrong with the password field :(")
password_field = chrome.find_element_by_xpath(password_xpath)
password_field.send_keys(password)
if not is_visible(sign_in_xpath): raise RuntimeError("Something went wrong with the sign in field :(")
sign_in_btn = chrome.find_element_by_xpath(sign_in_xpath)
sign_in_btn.click()

在这里,我们调用is_visible函数,并分别传递用户名,密码和sign_in按钮的xpath,然后等待该元素显示超时(此处为30s)。如果不可见,则引发带有相应消息的RuntimeError。
如果它出现在30s之前的任何时间,它将继续并通过xpath查找该元素(因为现它在网页上可见,因此此调用不会引发异常错误)。
然后,我们发送数据并单击登录,您就可以在GFG上学习,而不会遇到任何阻止呼叫的情况 😛