цепочки действий Selenn Webdriver не работают, как ожидалось - PullRequest
0 голосов
/ 07 апреля 2020

Я использую цепочку действий для раскрытия в селеновом веб-драйвере, вот мой код, может кто-нибудь помочь мне разобраться в чем дело. В этот раз я не использую шаблон объекта страницы, поэтому здесь нет аргумента «self».

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 голосов
/ 07 апреля 2020

Есть несколько проблем, но ничего особенного. Кажется, что все изменения должны быть сделаны в select_living_room.

  • select_living_room принимает объект context в своих аргументах, но затем первое, что он делает, это создает совершенно новый webDriver , Но затем получает доступ к совершенно другому webDriver, который является членом context. Я предполагаю, что вы пытаетесь сделать одно из следующих действий:
    1. accept context, в который уже включен драйвер. Если это так, избавьтесь от этого: driver = webdriver.Chrome()
    2. создайте новый драйвер в качестве атрибута 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...