我正在尝试使我必须进行特定交易的公司网站自动化。如果我想一次进行一笔交易而不是批量交易,我需要提交一笔交易,然后重新加载网页以提交另一笔交易。不幸的是,我需要单击以选择我的交易的按钮非常通用,并且只有一个索引来引用我希望交易的对象(我不知道之前的索引,它们会随着时间而变化)。因此,我必须在附近找到另一个特定元素并使用 ActionChains 进行偏移单击。不幸的是,我无法使用 find_element_by _link_text 因为可能有几个相同的名称占用不同的日期。因此,我需要使用包含日期和名称的特定 XPATH。
这是我需要使用然后偏移的 XPATH,因为这是我可以使用我的特定 XName 和 XDate 找到的所有内容。
//*[@onclick='javascript:pair("XName","XDate",0,0,"",0,"BC")']
如果我两次运行以下代码,它将在第一次尝试时起作用。第二次它会给出邪恶的 StaleElementReferenceException。
AC = ActionChains
def two4one(XName, XDate):
browser.execute_script('''window.open("link.com", "_blank");''')
browser.switch_to.window(browser.window_handles[-1])
AC.move_to_element_with_offset(browser.find_element(By.XPATH, f'''//*[@onclick='javascript:pair("{XName}","{XDate}",0,0,"",0,"BC")']'''), -75,0).click()
AC.perform()
如果我运行上面的代码一次,然后下面的代码可以找到没有问题的元素,甚至单击链接。可悲的是,这个点击的链接是我要偏移的链接,而不是我的最终目标,即左侧 75 像素。
def test241(XName, XDate):
browser.execute_script('''window.open("link.com", "_blank");''')
browser.switch_to.window(browser.window_handles[-1])
bob = browser.find_element_by_xpath(f'''//*[@onclick='javascript:pair("{XName}","{XDate}",0,0,"",0,"BC")']''')
bob.click()
我正在使用新标签进行故障排除。我还没有改回代码。
我希望能够使用不同的变量多次运行我的 two4one() 函数,但不幸的是,当我使用 ActionChains 时,它似乎会导致 StaleElementReferenceException。我仍然可以使用 browser.find_element() 找到元素,但动作链却找不到。我什至制作了一个变量来插入在我的 AC 代码之前打印的 AC,它会打印得很好,然后一旦遇到 AC 代码就会抛出错误。
老实说,我已经尝试了很多不同的东西,比如强制循环。WebDriverWait 立即抛出异常,而不是实际等待元素出现。老实说,我不知道如何使这项工作。
编辑:
列为重复的修复不起作用。据我所知,PageFactory 在 Python 中不可用。PageFactory 链接用于 Java。另一个“修复”不起作用,因为 WebDriverWait 实际上并没有等待。我还没有收到超时错误。一旦我的代码到达这一行
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, f'''//*[@onclick='javascript:pair("{item1}","{item2}",0,0,"",0,"CA")']''')))
它抛出 StaleElementReferenceException 并且在给我异常之前没有等待 10 秒。这让我感到困惑。我可以找到没有问题的元素
browser.find_element(By.XPATH, f'''//*[@onclick='javascript:pair("{item1}","{item2}",0,0,"",0,"CA")']''')
但是一旦我尝试另一种方法来查找元素,甚至使用 browser.find_element() 代码中的元素,它就会立即过时。
编辑:我找到了解决方法。我只是遍历交易列表,它仍然符合我想要的。我创建了一个计数器,它将每次迭代相加,然后与我需要单击的按钮的索引相对应。然后我使用 XPATH 中的计数器值来确定我需要单击的按钮。
希望这是有道理的。ActionChains 不想工作有点烦人。出于某种原因,我认为迭代需要更长的时间,但它们似乎更快。我昨天尝试了我的程序,但把我的输入搞砸了。哎呀。