Python Selenium:如何应用;及;期望条件下的逻辑运算符

Python Selenium:如何应用;及;期望条件下的逻辑运算符,python,selenium,expected-condition,Python,Selenium,Expected Condition,基本上,我想做的是搜索一个名字,然后点击一些部分匹配的名字。例如,我想搜索“John Doe”。SSRN将返回作者列表中包含John Doe的论文列表。下面是我尝试这样做的代码 name = "John Doe" try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, name.split(' ', 1)[

基本上,我想做的是搜索一个名字,然后点击一些部分匹配的名字。例如,我想搜索“John Doe”。SSRN将返回作者列表中包含John Doe的论文列表。下面是我尝试这样做的代码

name = "John Doe"
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, name.split(' ', 1)[0])) and
        EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, name.split(' ', 1)[1]))
    )
    # I want the element to be clicked only if both the first name and last name appear.
    element.click()
except:
    print("No result")
如果John Doe是完全匹配的,也就是说作者列表看起来像(John Doe,x,y,z),那么它是有效的。如果John Doe是一个部分匹配,并且没有其他部分匹配,即作者列表看起来像(John M.Doe,x,y,z),那么它是有效的。但是,如果存在多个部分匹配,则会中断。例如,如果列表看起来像(Jane Doe、John Doe、y、z)。然后,我的代码将选择Jane Doe。我想我想要一些类似于Java的EC.and()的东西,但我不确定如何实现它,或者是否有更好的方法来实现它。谢谢大家!

片段

EC.元素的存在位置((By.PARTIAL\u LINK\u TEXT,name.split(“”,1)[0]),以及
EC.元素的存在位置((By.PARTIAL\u LINK\u TEXT,name.split(“”,1)[1]))
只是评估为

EC.元素的存在位置((By.PARTIAL\u LINK\u TEXT,name.split(“”,1)[1]))
所以它总是只检查那个条件和那个条件,也就是说它总是只尝试查找
Doe
,完全忽略
John
。这就是为什么你会发现Jane Doe,因为它以前出现过

这不是检查多个条件的方式,您需要将类似object的函数传递到
。直到
,该函数可以检查多个条件并返回truthy/falsy值

对于您的特定需求,该功能可能会是-

def-presence\u-of-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the-of-the
name=“约翰·多伊”
first=EC.presence\u位于((By.PARTIAL\u LINK\u TEXT,name.split(“”,1)[0])(驱动程序)
second=EC.元素的存在位置((By.PARTIAL\u LINK\u TEXT,name.split(“”,1)[1]))(驱动程序)
如果first==second:
#这两个元素都存在,它们是相同的
先返回
其他:
返回错误
这将尝试查找带有部分链接文本“John”的元素,然后尝试查找带有部分链接文本“Doe”的元素-如果两个元素都找到了,并且都指向同一个元素,则为gold

你可以把它用在你的电脑里,直到你喜欢为止-

WebDriverWait(驱动程序,10)。直到(存在元素和元素)
然而,您可能会发现将其概括起来很方便-

def存在\u元素\u和\u全部(定位器):
def内部(驱动程序):
#获取与每个给定定位器匹配的所有元素
结果=[EC.定位器中定位器的元素存在(定位器)(驱动程序)]
#检查所有元素是否相同
#如果是,则所有条件都已满足
#如果没有,所有条件都不符合
如果len(set(results))==1,则返回结果[0],否则为False
返回内部
这将找到满足所有给定定位器的奇异元素

你可以这样使用它-

first\u name,last\u name=“John Doe”。拆分(“”)
WebDriverWait(驱动程序,10)。直到(存在所有元素([(By.PARTIAL\u LINK\u TEXT,first\u name),(By.PARTIAL\u LINK\u TEXT,last\u name)])
请注意,我正在使用闭包模式来实现这一点。在内部,
selenium
使用带有
\uuuu init\uuuu
类和函数来执行相同的操作-这称为类似函数的对象,如果需要,也可以使用它-

class presence\u\u元素\u与\u all:
定义初始化(自身,定位器):
self.locators=定位器
定义呼叫(自身、驾驶员):
结果=[EC.presence_of_element_located(locator)(driver)for self.locators中的定位器]
#检查所有元素是否相同
#如果是,则所有条件都已满足
#如果没有,所有条件都不符合
如果len(set(results))==1,则返回结果[0],否则为False

您将使用与闭包模式完全相同的方法。

使用哪个元素。直到
返回为止?因为你基本上是想找到2个元素,所以我希望这个元素是匹配“John”和“Doe”的。如果有道理的话,可能是约翰·多伊、约翰·杰克·多伊或约翰·多伊。非常感谢你给出如此详尽的答案!它确实起了作用。我也一直在尝试一些更复杂的事情,你的回答也有帮助。