执行存储在变量中的 Selenium 命令(Python > Webdriver)

Executing a Selenium command stored in a variable (Python > Webdriver)

我正在尝试创建一个定义,使我可以在不考虑元素类型的情况下单击对象。为此,我创建了一个变量,其中包含我想要 运行.

的命令
def clickOnStaleElement(driver, objStrategy, element):
    lhs, rhs = objStrategy.split(".", 1)
    myCommand = "driver.find_element_by_"+rhs.lower()+"(\""+element+"\").click()"

我似乎无法弄清楚如何执行存储在变量中的这条命令。我尝试了 'driver.execute_script()' 但收到了 WebDriverException。尝试“exec()”和“eval()”导致文本挂起。我如何实现这一目标?有没有更好的方法来实现这种行为?我意识到我尝试实现此行为的方式可能并不理想,因此我愿意接受更好的方法来完成相同的任务。如果可能,我不想为每种元素类型创建 'if/then' 语句。

def clickOnStaleElement(driver, objStrategy, element):
    lhs, rhs = objStrategy.split(".",1) #ASSUMING only valid stuff comes down like "???.xpath" , "???.name" "???.id" bla bla ... we'll just keep this here for now....
    if rhs == 'xpath':
        myCommand = driver.find_eleemnt_by_xpath(element) # xpath example, you better hope you entered valid xpath as "element"
    elif rhs == 'id':
        myCommand = driver.find_eleemnt_by_id(element)
    elif rhs == 'name':
       #you get the idea
.
.
.
    else:
        print("rhs, not recognized/valid/watever")
    myCommand.click()

我会从字面上将其分解为每个在 rhs 上都有自己的 If 语句。

同样在我看来,没有理由将像这样的“???.somethng”传递给 objStrategy,为什么不传递你真正想要的东西呢?

您可以创建一个字典,提供从字符串到函数的映射,然后进行简单的查找:

strategy = {
    "id":   driver.find_element_by_id,
    "name": driver.find_element_by_name,
    ...
}
find_element = strategy.get(rhs.lower())
find_element(element).click()

您可能想要一个默认方法,或者为 rhs.lower() 与字典中的任何内容都不匹配的情况做准备。