硒webdriver操作链无法按预期运行

时间:2020-04-07 03:33:24

标签: python selenium selenium-webdriver automation

我正在使用动作链插入Selenium Webdriver中,这是我的代码,谁能帮助我找出问题所在。这次我不使用页面对象模式,因此这里没有“自我”参数。

from selenium import webdriver
from behave import given, when, then
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains


@given('Open RF page')
def open_website(context):
    context.driver.get('https://www.raymourflanigan.com/')


@when('Select Living Room')
def select_living_room(context):
    driver = webdriver.Chrome()
    actions = ActionChains(driver)
    menu = context.driver.find_element(By.XPATH, "//*[@id='Container']/div[1]/div[3]/div[1]/a")
    sofa = context.driver.find_element(By.XPATH, "//*[@id='Container']/div[1]/div[3]/div[1]/div/div[1]/ul/li[2]/a")
    actions.move_to_element(menu).move_to_element(sofa).click()


@then("Verify {product} are available")
def verify(context, product):
    result = context.driver.find_element(By.CSS_SELECTOR, "h1.Category_Bnr_Title").text
    assert 'Sofas & Couches' in result,  f"Expected text is:  {result}."

我也删除了perform(),因为由于某些原因第二个函数不能在其中使用perform()。似乎没有它也无法正常工作,因此,如果有人知道原因并可以帮助我,那将是很棒的!我正在学习)预先谢谢!

1 个答案:

答案 0 :(得分:0)

有一些问题,但是没有太大的问题。似乎所有更改都需要在select_living_room中完成。

  • select_living_room的参数中包含一个context对象,但是它要做的第一件事是创建一个全新的webDriver。但是然后,它会访问完全不同的 webDriver,它是context的成员。我猜您正在尝试执行以下一项操作:
    1. 接受context,其中已包含驱动程序。如果是这种情况,请消除此情况:driver = webdriver.Chrome()
    2. 创建一个 new 驱动程序作为context的属性。在这种情况下,请更改为:context.driver = webdriver.Chrome()
  • 在任何一种情况下,我都看不到驱动程序上调用get来打开页面的任何地方。在select_living_room中,有必要调用open_website
  • ActionChain未运行。最后需要添加一个perform()呼叫。

我将select_living_room更改为这样(假设webDriver已在context内部设置):

@when('Select Living Room')
def select_living_room(context):
    open_website(context)
    menu = context.driver.find_element(By.XPATH, "//*[@id='Container']/div[1]/div[3]/div[1]/a")
    sofa = context.driver.find_element(By.XPATH, "//*[@id='Container']/div[1]/div[3]/div[1]/div/div[1]/ul/li[2]/a")
    actions = ActionChains(context.driver)
    actions.move_to_element(menu).move_to_element(sofa).click().perform()

然后像这样运行:

opts = webdriver.ChromeOptions()
ctx = Context(webdriver.Chrome('path/to/chromedriver', options=opts))
select_living_room(ctx)
verify(ctx, None)

请注意,您没有提及Context是什么。我把它存根了:

class Context:
  def __init__(self, ctx):
    self.driver = ctx