繁体   English   中英

如何在 Selenium Python 中使用 WebDriverWait 修复此语法错误

[英]How can I fix this syntax error using WebDriverWait in Selenium Python

我是学习 python 的初学者,我的代码有问题。 这似乎是一个简单的错误,但我找不到此错误的解决方案。

这是一个代码

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.google.co.jp/")
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.NAME, "q"))
search_box = driver.find_element_by_name('q')
search_box.send_keys('Selenium')

  File "<ipython-input-12-1cac2821f197>", line 4
    search_box = driver.find_element_by_name("q")
             ^
SyntaxError: invalid syntax

search_box.submit()


driver.implicitly_wait(10)
driver.find_element_by_link_text("Selenium - Web Browser Automation").click()
time.sleep(5)
driver.quit()

问题出在第 6 行。我试图运行代码,但它说“search_box”是无效的语法。 有谁知道这个的解决方案?

语法错误经常出现在上面的行中,尤其是当这些行包含括号时。 一个技巧是计算打开和关闭括号。 如果结果不为零,则有问题:

WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.NAME, "q"))
             ^          ^      ^                              ^^            ^^
             1          0      1                              23            21

在这一行:

WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.NAME, "q"))

最后缺少一个右括号。 并且 WebDriverWait 尚未导入:

from selenium.webdriver.support.ui import WebDriverWait

您需要考虑以下几点:

  • 诱导WebDriverWait后,您不必再次使用find_element_by_* 因此,您可以删除该行:

     search_box = driver.find_element_by_name('q')
  • 当您打算与元素而不是 present_of_element_located( presence_of_element_located()交互时,您需要element_to_be_clickable()expected_conditions

  • 此外, element_to_be_clickable()应该在tuple中调用,因为它不是function而是class ,其中初始化程序只需要隐式self之外的1 个参数:

     class element_to_be_clickable(object): """ An Expectation for checking an element is visible and enabled such that you can click it.""" def __init__(self, locator): self.locator = locator def __call__(self, driver): element = visibility_of_element_located(self.locator)(driver) if element and element.is_enabled(): return element else: return False

您可以在init () 中找到相关讨论,需要 2 个位置 arguments 但使用 WebDriverWait 和 expected_conditions 作为 element_to_be_clickable 和 Selenium ZA7F5F35426B927411FC92315B 给出了 3 个


解决方案

您可以将所需的三 (3) 行合并为一行,如下所示:

WebDriverWait(driver, 10).until((EC.element_to_be_clickable(By.NAME, "q"))).send_keys('Selenium')

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM